Input
2Output
2
Hint
1. For N = 2, S(1) = S(2) = 1. 2. The input file consists of multiple test cases.
转自 点击打开链接
题目大意:
看似复杂,其实就是求整数n的划分数,4=1+1+2和4=1+2+1是不同的。因而可知答案是2n-1。
题目分析:
因为n实在是太大太大了,这可咋办啊?!n<10100000。
做这场的时候没有注意到,也是当时没有看过什么是费马小定理,居然跟模值有关系!mod=1000000007。这个mod有什么特点呢?它是个质数。
费马小定理揭示了:当p是一个素数并且a和p互质时,ap-1 %p≡1。
那么在这道题里a=2,p=mod。显然满足费马小定理。再根据同余模定理,
当n>p时:设m=n-p。那么an-1=am+p-1=ap-1*am。因而an-1%p=am+p-1%p=((ap-1%p )*(am%p))%p=1*am%p。
这么我们就可以断定mod-1是一个循环节。先用大数对它取模,然后数据量就可以承受得起了,再用快速幂,这道题就解了!
#include<iostream>
#include<string>
#define mod 1000000007
using namespace std;
typedef long long ll;
string str;
ll q_pow(ll a,ll b){
ll ans=1;
ll base=a;
while(b){
if(b&1) ans=ans*base%mod;
base=base*base%mod;
b>>=1;
}
return ans;
}
int main(){
while(cin>>str){
int n=str.length();
ll num=0;
for(int i=0;i<n;i++)
num=(num*10+(str[i]-'0'))%(mod-1);
if(num==0) cout<<q_pow(2,mod-2)<<endl;
else cout<<q_pow(2,num-1)<<endl;
}
return 0;
}