17-05-25模拟赛
T1:
统计1~N中所有数中含因数5的个数。(末尾0的个数可以看成是2*5的个数,其中2的个数在N>=2时一定比5的个数多)
考虑对N不断除以5并累加答案。由于n<=101000,所以需要用到高精度计算。
Code:
1 #include<cmath> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 struct hpc{ 7 int a[405],len; 8 }n,res; 9 char ch[1005]; 10 hpc in(char ch[]){ 11 int l=strlen(ch),alen;hpc ans; 12 alen=0;memset(ans.a,0,sizeof(ans.a)); 13 for (int i=l-1;i>=0;i-=4){ 14 int t=0,x=max(0,i-3); 15 for (int j=x;j<=i;++j) t=(t<<3)+(t<<1)+(ch[j]-'0'); 16 ans.a[alen++]=t; 17 }ans.len=alen; 18 return ans; 19 } 20 hpc operator +(const hpc &x,const hpc &y){ 21 hpc ans;int &len=ans.len,l=max(x.len,y.len); 22 memset(ans.a,0,sizeof(ans.a)); 23 for (int i=0;i<l;i++){ 24 if (i<x.len) ans.a[i]+=x.a[i]; 25 if (i<y.len) ans.a[i]+=y.a[i]; 26 ans.a[i+1]+=ans.a[i]/10000;ans.a[i]%=10000; 27 }len=l; 28 for (;ans.a[len]>0;len++){ 29 ans.a[len+1]=ans.a[len]%10000;ans.a[len]/=10000; 30 } 31 return ans; 32 } 33 hpc operator /(const hpc &x,const int &b){ 34 hpc ans;int &len=ans.len; 35 memset(ans.a,0,sizeof(ans.a)); 36 for (int i=x.len-1;i;i--){ 37 ans.a[i-1]+=(ans.a[i]+x.a[i])%b*10000; 38 ans.a[i]=(ans.a[i]+x.a[i])/b; 39 }ans.a[0]=(ans.a[0]+x.a[0])/b; 40 for (len=x.len;!ans.a[len-1];len--); 41 return ans; 42 } 43 void print(const hpc &x){ 44 printf("%d",x.a[x.len-1]); 45 for (int i=x.len-2;i>=0;i--) printf("%.4d",x.a[i]); 46 } 47 int main() 48 { 49 scanf("%s",ch);n=in(ch);res.a[0]=0;res.len=1; 50 while (n.a[0]||(n.len>1)){n=n/5;res=res+n;} 51 print(res);return 0; 52 }
T2:
依题意进行模拟即可。
Code:
1 #include<cmath> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 char s[3005][22],opr[22],ch[22]; 6 int q,cnt,dig[22]; 7 bool p[3005]; 8 int main() 9 { 10 scanf("%d",&q);cnt=0; 11 while(q--){ 12 scanf("%s%s",opr,ch); 13 if (opr[0]=='O'){ 14 bool f=0; 15 for (int i=1;i<=cnt;i++) if (!strcmp(s[i],ch)) {p[i]=1;f=1;break;} 16 if (!f) {strcat(s[++cnt],ch);p[cnt]=1;} 17 } 18 else if(opr[0]=='S'){for (int i=1;i<=cnt;i++) if (!strcmp(s[i],ch)) {p[i]=0;break;}} 19 else if(opr[0]=='P'){ 20 int ans=0,pos=0; 21 for (int i=0;i<strlen(ch);i++) if (ch[i]!='?') dig[++pos]=i; 22 for (int i=1;i<=cnt;i++) 23 if (!p[i]||strlen(s[i])!=strlen(ch))continue; 24 else{ 25 int l=strlen(ch);bool eq=1; 26 for (int j=1;j<=pos;j++) if (ch[dig[j]]!=s[i][dig[j]]) {eq=0;break;} 27 if (eq) ans++; 28 } 29 printf("%d\n",ans); 30 } 31 } 32 return 0; 33 }
T3:
枚举第一行及第一列的状态,根据该状态可以推出接下来的灯的亮暗,由此可以找出下一步是否需要按按钮。(dfs)
Code:
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #define inf 0x7fffffff 5 using namespace std; 6 bool a[9][9]; 7 int t,n,m,ans; 8 char ch; 9 void change(int x,int y) 10 { 11 a[x][y]^=1; 12 if (y>1) a[x][y-1]^=1; 13 if (y<m) a[x][y+1]^=1; 14 if (x>1){ 15 a[x-1][y]^=1; 16 if (y>1) a[x-1][y-1]^=1; 17 if (y<m) a[x-1][y+1]^=1; 18 } 19 if (x<n){ 20 a[x+1][y]^=1; 21 if (y>1) a[x+1][y-1]^=1; 22 if (y<m) a[x+1][y+1]^=1; 23 } 24 } 25 bool judge() 26 { 27 for (int i=1;i<=n;++i) if (!a[i][m]) return 0; 28 for (int i=1;i<=m;++i) if (!a[n][i]) return 0; 29 return 1; 30 } 31 void dfs(int x,int y,int step) 32 { 33 if (step>=ans) return; 34 if (y>m) {if (judge()) ans=step;return;} 35 if (x==1||y==1){ 36 change(x,y); 37 if (x<n) dfs(x+1,y,step+1); 38 else dfs(1,y+1,step+1); 39 change(x,y); 40 if (x<n) dfs(x+1,y,step); 41 else dfs(1,y+1,step); 42 }else{ 43 if ((x==n)&&(a[x-1][y-1]!=a[x][y-1])) return; 44 if (!a[x-1][y-1]){ 45 change(x,y); 46 if (x<n) dfs(x+1,y,step+1);else dfs(1,y+1,step+1); 47 change(x,y); 48 }else { 49 if (x<n) dfs(x+1,y,step);else dfs(1,y+1,step); 50 } 51 52 } 53 } 54 int main() 55 { 56 scanf("%d",&t); 57 while (t--){ 58 scanf("%d%d",&n,&m);memset(a,0,sizeof(a));ans=inf; 59 for (int i=1;i<=n;++i){ 60 scanf("%c",&ch); 61 for (int j=1;j<=m;++j){ 62 scanf("%c",&ch); 63 a[i][j]=(ch=='*')?1:0; 64 } 65 } 66 dfs(1,1,0);printf("%d\n",(ans==inf)?-1:ans); 67 } 68 return 0; 69 }
T4:
状态压缩dp。f[i][j]表示比到字符串长度为i情况为j时,能够匹配的情况数。其中j在二进制中的第k位数若为1,则表示第k个子串能取到,若为0则表示不能取到。
Code:
#include<cmath> #include<cstdio> #include<cstring> #define mod 1000003 using namespace std; char s[16][52]; int f[52][1<<15]; int n,k,len,ans; void dp() { f[0][(1<<n)-1]=1; for(int i=0;i<len;++i){ for (int j=0;j<(1<<n);++j) if (f[i][j]){ for (char k='a';k<='z';++k){ int curs=j; for (int l=0;l<n;++l) if (((j>>l)&1)&&(s[l][i]!='?')&&(k!='?')&&s[l][i]!=k) curs-=(1<<l); f[i+1][curs]=(f[i+1][curs]+f[i][j])%mod; } } } } int main() { scanf("%d%d",&n,&k); for (int i=0;i<n;++i) scanf("%s",s[i]); len=strlen(s[0]);dp(); for (int i=0;i<(1<<n);++i){ int cnt=0; for (int j=0;j<n;++j) cnt+=(i>>j)&1; if (cnt==k) ans=(ans+f[len][i])%mod; }printf("%d",ans);return 0; }
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步