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

 

posted on 2017-05-26 11:32  whz2002  阅读(139)  评论(0编辑  收藏  举报