版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Miranda_ymz/article/details/82974161
分类:数论+费马小定理+找规律
题意:给出N,s(k)=num(x1,x2,x3...,xk).s(k)==将N分成k组得数量。给出N问(s(1)+s(2)....s(N))%mod得值。
思路:看懂题意手动模拟算以下前面几个= =
N=1 s(1)=1 ans=1;
N=2 s(1)=1 s(2)=1 ans=2;
N=3 s(1)=1 s(2)=2 s(3)=1 ans=4;
N=4 s(1)=1 s(2)=3 s(3)=3 s(4)=1 ans=8;
......好吧答案应该就是2^(n-1)%mod.(不行得的话大家也可以打表试试),或者手动在撸一遍N=5,6,7
根据题意n得值真的是非常大。
看过费马小定理的就知道这个肯定要用费马小定理了:如果n和mod互质,a^n%mod==a^(n%(mod-1))%mod
所以处理以下输入的数据,字符串转整数顺便取模。
#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
ll quick_pow(ll a,ll n)
{
ll ans=1;
while(n)
{
if(n&1)
{
ans*=a;
ans%=mod;
}
a*=a;
a%=mod;
n>>=1;
}
return ans;
}
int main()
{
ll a,b;
string s;
while(cin>>s)
{
ll sum=0;
int len=s.size();
for(int i=0;i<len;i++)
{
sum=(sum*10+s[i]-'0')%(mod-1);
}
sum=(sum-1+mod-1)%(mod-1);
ll ans=quick_pow(2,sum);
printf("%lld\n",ans%mod);
}
return 0;
}