• 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
    ",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
    ",(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; 
    }
  • 相关阅读:
    Pycharm的快捷键
    【Python】笔记1:Spyder常用快捷键
    npm常用命令整理
    MVC4 IIS7.5 403.14错误的解决办法
    AO 获取系统自带的工具条
    CentOS 7.3下安装Redis
    CentOS 7.3下安装MySql
    安装sql server 2005时出现“安装汇编”错误的解决办法
    解决IIS下localhost访问需要输入用户名和密码的问题
    不断沟通,反复确认
  • 原文地址:https://www.cnblogs.com/codingutopia/p/test170525.html
Copyright © 2020-2023  润新知