11.8 模拟赛

 luogu 粲泽的小测试  #3  还可以 

馒头太强啦 帮助我们写出了第三题

T1:龙盘雪峰信息解析器

模拟

一个二进制串 每8个为一个单元

按照一些奇怪的规则翻译

主要是看情况讨论全不全

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cmath>
 5 #include<cstdlib>
 6 #include<cstring>
 7 #include<queue>
 8 #include<vector>
 9 #define ll long long
10 #define MAXN 172111
11 using namespace std;
12 inline ll read()
13 {
14     ll x=0,f=1;char ch=getchar();
15     while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
16     while(isdigit(ch)) {x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
17     return x*f;
18 }
19 int len,k[8]={1,2,4,8,16,32,64,128},i,an[MAXN];
20 char a[MAXN],ans[MAXN];
21 int main()
22 {
23     scanf("%s",a);
24     len=strlen(a);
25     int tmp,k1;
26     if(len%8) {printf("Error");return 0;}
27     for(i=0;i<len;i++) {if(a[i]!='0'&&a[i]!='1'){printf("Error");return 0;}}
28     for(i=0;i<len;i+=8)
29     {
30         if(a[i]=='1'&&a[i+1]=='1'&&a[i+2]=='1') {ans[i/8]=' ';continue;}
31         if(a[i]=='1'&&a[i+1]=='0'&&a[i+2]=='1')
32         {
33             tmp=0;
34             for(int j=i+3;j<i+8;j++) tmp+=(a[j]-'0')*k[i+7-j];
35             if(tmp>25) break;
36             else ans[i/8]=(char) 'A'+tmp;
37             continue;
38         }
39         if(a[i]=='0')
40         {
41             if(a[i+8]!='0') break;
42             tmp=k1=0;
43             for(int j=i+1;j<i+8;j++)
44                 tmp+=(a[j]-'0')*k[i+7-j];
45             tmp/=2;
46             for(int j=i+8;j<i+8+8;j++)
47                 k1+=(a[j]-'0')*k[i+15-j];
48             k1/=2;
49             ans[i/8]=ans[i/8+1]='@';
50             an[i/8]=tmp+k1,an[i/8+1]=-1;
51             i+=8;
52             continue;
53         }
54         break;
55     }
56     if(i==len) 
57     {
58         for(int j=0;j<len/8;j++) 
59         {
60             if(ans[j]!='@') printf("%c",ans[j]);
61             else if(an[j]!=-1) printf("%d",an[j]);
62         }
63         return 0;
64     }
65     printf("Error");
66 }
View Code

T2:赛斯石(赛后强化版)

简单背包???

但是因为dp数组有可能到long long挂掉了一个点

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cmath>
 5 #include<cstdlib>
 6 #include<cstring>
 7 #include<queue>
 8 #include<vector>
 9 #define ll long long
10 #define MAXN 100100
11 using namespace std;
12 inline ll read()
13 {
14     ll x=0,f=1;char ch=getchar();
15     while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
16     while(isdigit(ch)) {x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
17     return x*f;
18 }
19 ll n,a[15],dp[MAXN],k[11]={0,1,3,5,7,10,15,16,18,21,23};
20 int main()
21 {
22     n=read();
23     for(int i=1;i<=10;i++) a[i]=read();
24     for(int i=1;i<=n;i++)
25         for(int j=min(i,10);j;j--)
26             dp[i]=max(dp[i],dp[i-j]+a[j]-k[j]);
27     printf("%lld",dp[n]);
28 }
View Code

T3:琅泽难题

一道找规律题

通过打表发现出现的数只可能是Q 1 3 5 7

其他数都不会出现  因为Q!=1 所以Q只会在最后出现

同时通过打表发现3 5 7 的个数都跟fibonacci有着关系

然后直接矩阵快速幂求fibonacci即可

但是挂了一个点???

因为最后答案是模数的倍数导致输出了-1

这个人太强啦

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cmath>
 5 #include<cstdlib>
 6 #include<cstring>
 7 #include<queue>
 8 #include<vector>
 9 #define ll long long
10 #define MAXN 2510
11 #define MOD 20171111
12 using namespace std;
13 inline ll read()
14 {
15     ll x=0,f=1;char ch=getchar();
16     while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
17     while(isdigit(ch)) {x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
18     return x*f;
19 }
20 ll n,m,x,ans;
21 struct mat {ll num[2][2];};  
22 mat mul(mat x,mat y)  
23 {  
24     mat res;
25     memset(res.num,0,sizeof(res.num));  
26     for(ll i=0;i<2;i++)  
27         for(ll j=0;j<2;j++)  
28             for(ll k=0;k<2;k++)  
29                 (res.num[i][j]+=x.num[i][k]*y.num[k][j])%=MOD;
30     return res;
31 }
32 ll q_pow(ll n)
33 {
34     if(n<=0) return 0;
35     mat t,res;
36     memset(res.num,0,sizeof(res.num));
37     t.num[0][0]=t.num[0][1]=t.num[1][0]=1,t.num[1][1]=0;
38     res.num[0][0]=res.num[1][1]=1;
39     while(n)
40     {
41         if(n&1) res=mul(res,t);
42         t=mul(t,t);
43         n>>=1;
44     }  
45     return res.num[0][1];
46 }
47 int main()
48 {
49     m=read(),n=read(),x=read();
50     if(x==m) ans=1;
51     if(x==3&&n>3) ans++;
52     if(x==5) ans+=(q_pow(n/2)-1+MOD)%MOD;
53     if(x==7) ans+=(q_pow(n/2-1)-1+MOD)%MOD;
54     printf("%lld",ans);
55 }
View Code
原文地址:https://www.cnblogs.com/yyc-jack-0920/p/7805885.html