• hdu 4990(数学,等比数列求和)


    Reading comprehension

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 1270    Accepted Submission(s): 512


    Problem Description
    Read the program below carefully then answer the question.
    #pragma comment(linker, "/STACK:1024000000,1024000000")
    #include <cstdio>
    #include<iostream>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #include<vector>

    const int MAX=100000*2;
    const int INF=1e9;

    int main()
    {
      int n,m,ans,i;
      while(scanf("%d%d",&n,&m)!=EOF)
      {
        ans=0;
        for(i=1;i<=n;i++)
        {
          if(i&1)ans=(ans*2+1)%m;
          else ans=ans*2%m;
        }
        printf("%d ",ans);
      }
      return 0;
    }
     
    Input
    Multi test cases,each line will contain two integers n and m. Process to end of file.
    [Technical Specification]
    1<=n, m <= 1000000000
     
    Output
    For each case,output an integer,represents the output of above program.
     
    Sample Input
    1 10 3 100
     
    Sample Output
    1 5
     
    Source
     
    这个题就是需要用log(n)解决上面的程序问题。
    然后我们找奇数项的关系。
    f[2k+1] = 2*f[2k] + 1 (k>=1)
    f[2k] = 2*f[2k-1]
    代入可得 f[2k+1] = 4*f[2k-1]+1 => bi = 4*bi-1+1
    bi = 4*bi-1+1
    bi-1 = 4*bi-2+1
    ..
    b3 = 4*b2 + 1
    b2 = 4*b1 +1
    可得bk = 1+4+4^2+....+4^k-1
    k与n之间的映射是 k = (n+1)/2 然后带入模板算就OK。偶数的话乘2.
    #include <cstdio>
    #include<iostream>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #include<vector>
    typedef long long LL;
    
    LL mod;
    LL pow_mod(LL a,LL n){
        LL ans = 1;
        while(n){
            if(n&1) ans=ans*a%mod;
            a= a*a%mod;
            n>>=1;
        }
        return ans;
    }
     LL cal(LL p,LL n){  ///这里是递归求解等比数列模板 1+p+p^2...+p^n
        if(n==0) return 1;
        if(n&1){///(1+p+p^2+....+p^(n/2))*(1+p^(n/2+1));
             return (1+pow_mod(p,n/2+1))*cal(p,n/2)%mod;
        }
        else { ///(1+p+p^2+....+p^(n/2-1))*(1+p^(n/2+1))+p^(n/2);
             return (pow_mod(p,n/2)+(1+pow_mod(p,n/2+1))*cal(p,n/2-1))%mod;
        }
    }
    
    int main()
    {
        LL n;
        while(scanf("%lld%lld",&n,&mod)!=EOF)
        {
            if(n==1&&mod==1) {
                printf("0
    ");
                continue;
            }
            LL k = (n+1)/2;
            LL ans = cal(4,k-1);
            if(n&1){
                printf("%lld
    ",ans);
            }else {
                printf("%lld
    ",ans*2%mod);
            }
        }
        return 0;
    }
  • 相关阅读:
    从一个简单的例子谈谈package与import机制
    java 中public 类
    java 内部类
    使用Maven运行Java main的3种方式
    递归删除目录下.svn文件
    react-redux的connect()方法
    react 调用 function 的写法 及 解决 react onClick 方法自动执行
    react 路由传参
    react-redux 和 redux-saga 小结
    百度地图 放大或缩小后 中心点偏移(中心点不是在放大前的点)
  • 原文地址:https://www.cnblogs.com/liyinggang/p/5632477.html
Copyright © 2020-2023  润新知