• HDU


    先上题目:

    Sum

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
    Total Submission(s): 206    Accepted Submission(s): 113


    Problem Description
     
    Sample Input
    2
     
    Sample Output
    2
    Hint
    1. For N = 2, S(1) = S(2) = 1. 2. The input file consists of multiple test cases.
     
      2013多校第十场的其中一题,题意就是根据他给的公式求出结果,其实结果就等于2^(n-1),但是这里的n很大,用普通的快速幂解不出来。这里的解法有两种,一是用数论的某一条公式,另一种是这样的指数p可以写成p=p0p1p2p3p4p5p6p7p8···结果:
                                                   ans0=1*(2^p0)%MOD;
                      ans1=ans0^10*2^(p1)%MOD;
                      ``````
      在这种情况下这种方法的速度比用普通的快速幂更快,只要在每一个求幂的位置都用快速幂就可以了。
     
    上代码:
     1 #include <stdio.h>
     2 #include <string.h>
     3 #define MAX 1000001
     4 #define MOD 1000000007
     5 using namespace std;
     6 
     7 char s[MAX];
     8 
     9 void Sub(int &len)
    10 {
    11     int i;
    12     if(s[len-1]>'0') s[len-1]--;
    13     else
    14     {
    15         for(i=len-1;i>=0 && s[i]=='0';i--) s[i]='9';
    16         s[i]--;
    17         if(s[i]=='0'){s[i]='9'; len--;s[len]='';}
    18         //if(len==0){s[0]='0';len=1;}
    19     }
    20 
    21 }
    22 
    23 long long Fast_Mod(long long a,int p)
    24 {
    25     if(p==0) return 1;
    26     if(p==1) return a%MOD;
    27     long long t=Fast_Mod(a,p>>1);
    28     t=t*t%MOD;
    29     if(p&1) t=t*a%MOD;
    30     return t;
    31 }
    32 
    33 int main()
    34 {
    35     int i,len,t;
    36     long long ans;
    37     //freopen("data.txt","r",stdin);
    38     while(scanf("%s",s)!=EOF)
    39     {
    40         len=strlen(s);
    41         Sub(len);
    42         ans=1;
    43         //printf("%s
    ",s);
    44         for(i=0;i<len;i++)
    45         {
    46             t=s[i]-'0';
    47             ans=Fast_Mod(ans,10);
    48             ans=ans*Fast_Mod(2,t)%MOD;
    49         }
    50         printf("%I64d
    ",ans);
    51     }
    52     return 0;
    53 }
    4074
  • 相关阅读:
    LeetCode题目(python)
    解决:centos配置ssh免密码登录后仍要输入密码
    解决 find: 路径必须在表达式之前:
    --解决Lock wait timeout exceeded; try restarting transaction
    Linux文件删除,但是df之后磁盘空间没有释放
    定位class时空格注意
    解决jenkins的Console Output中文乱码
    CPU飙升问题排查
    JVM笔记
    List集合的使用
  • 原文地址:https://www.cnblogs.com/sineatos/p/3276395.html
Copyright © 2020-2023  润新知