Arab Collegiate Programming Contest 2012 J- Math Homework

思路:由于只有1-6这几个数,而这几个数的最小公倍数是60,所以只需要求出60以内有多少满足条件的数即可。

再就是求出对于给定的n,求出60的倍数。然后就是怎样求的问题了。

首先可以写成如下形式:

               10n-40=60*n (把最后的40个数去掉,最后在求结果的时候再加上)

               n=(10n-40)/60. (结果一定可以整除)

代码如下:

 1 #include<cstdio>
 2 #define ll long long
 3 #define mod 1000000007
 4 ll pw(ll a,ll b)
 5 {
 6     ll ans=1;
 7     while(b){
 8         if(b&1) ans=ans*a%mod;
 9         b>>=1;
10         a=a*a%mod;
11     }
12     return ans;
13 }
14 int main()
15 {
16     int i,j,t;
17     ll n;
18     char str[10];
19     bool f[61];
20     scanf("%d",&t);
21     while(t--){
22         scanf("%I64d %s",&n,str);
23         for(i=0;i<60;i++){
24             f[i]=1;
25             for(j=0;j<6;j++){
26                 if(str[j]=='0'&&i%(j+1)==0) f[i]=0;
27                 else if(str[j]=='1'&&i%(j+1)!=0) f[i]=0;
28             }
29         }
30         int c=0;
31         if(n==1){
32             for(i=0;i<=9;i++) c+=f[i];
33             printf("%d
",c);
34             continue;
35         }
36         for(i=0;i<60;i++) c+=f[i];
37         ll p=pw(10,n);
38         ll ans=(p-40+mod)%mod*pw(60,mod-2)%mod;
39         ans=ans*c%mod;
40         for(i=0;i<40;i++) ans+=f[i];
41         printf("%I64d
",ans);
42     }
43     return 0;
44 }
View Code

 

原文地址:https://www.cnblogs.com/xin-hua/p/3369782.html