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 }
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 }
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 }