HDU - 4704 sum 大数取余+欧拉降幂

Sum

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


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.
 

 

Source
 

 

Recommend
zhuyuanchen520
 
 
一道学长教的数论题。找出规律后发现求的是2^(n-1)。
利用费马小定理欧拉降幂
由于n非常大,可采用字符串读入,读入同时分位取余(((a*100%MOD)+b*10%NOD)+c%MOD)%MOD,最后跑一边快速幂。
注意n-1,MOD-1
适用于Java大数超时的情况。
--------------------------------------------------------------
ps:后续。竟然成为了18年网络赛的原题...
 
 
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<string>
#include<math.h>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<vector>
#include<algorithm>
#define MAX 1000005
#define INF 0x3f3f3f3f
#define MOD 1000000007
using namespace std;

typedef long long ll;

ll qMod(ll a,ll b){
    ll ans=1;
    while(b>0){
        if(b&1) ans=ans*a%MOD;
        b>>=1;
        a=a*a%MOD;
    }
    return ans;
}
int main()
{
    int n,len,i;
    char s[MAX];
    while(~scanf(" %s",s)){
        ll c=0;
        len=strlen(s);
        for(i=0;i<len;i++){
            int x=s[i]-'0';
            c=c*10+x;
            if(c>1000000006) c%=1000000006;
        }
        c=((c-1)%1000000006+1000000006)%1000000006;
        printf("%lld\n",qMod(2,c));
    }
    return 0;
}

 

posted @ 2018-04-08 22:52  yzm10  阅读(380)  评论(0编辑  收藏  举报