• 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

     

  • 相关阅读:
    Python进阶06 循环对象
    Python进阶05 循环设计
    Python进阶 函数的参数对应
    Python进阶01 词典
    Python基础 反过头来看看
    Python基础08 面向对象的基本概念
    利用zepto.js实现移动页面图片全屏滑动
    数组弃重方法
    fcc筆記
    文字颜色渐变效果
  • 原文地址:https://www.cnblogs.com/xin-hua/p/3369782.html
Copyright © 2020-2023  润新知