推几项之后可以发现,答案就是.但是n是1e十万,太大了
1.解法①欧拉降幂
欧拉降幂有两个公式(求%m)
①当a与m互质时(gcd(a,m)=1)
而当此时m是质数的话,,这下就和费马小定理降幂一样了
②当a与m不互质(gcd(a,m)!=1),且时
#include<cstring>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define mod 1000000007
ll getmod(string s,ll m)
{
int len=s.length();
ll sum=0;
for(int i=0;i<len;++i)
{
sum=(sum*10ll+s[i]-'0')%m;
}
return sum;
}
long long pow_mod(long long a,long long n,long long m)//a^n mod m
{
long long res=1;
while(n>0)
{
if(n&1==1)
res=res*a%m;
a=a*a%m;
n>>=1;
}
return res;
}
//记得在最后输出结果的时候再模m一次
int main()
{
int T;
cin>>T;
while(T--)
{
string s;
cin>>s;
ll m=getmod(s,mod-1);//求n%(p-1)
m=(m%mod-1)%mod;//求(n-1)%(p-1)
cout<<pow_mod(2,m,mod)<<endl;
}
return 0;
}
2.解法② 指数循环节
指数次幂取模都是有循环节的,因为取模了嘛,将它限制在了一定的范围里面
通过计算可以知道本题的循环节是500000003,也就是说%mod=
#include<cstring>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define mod 1000000007
ll getmod(string s,ll m)
{
int len=s.length();
ll sum=0;
for(int i=0;i<len;++i)
{
sum=(sum*10ll+s[i]-'0')%m;
}
return sum;
}
long long pow_mod(long long a,long long n,long long m)//a^n mod m
{
long long res=1;
while(n>0)
{
if(n&1==1)
res=res*a%m;
a=a*a%m;
n>>=1;
}
return res;
}
//记得在最后输出结果的时候再模m一次
int main()
{
int T;
cin>>T;
while(T--)
{
string s;
cin>>s;
ll m=getmod(s,500000003);//求n%(500000003)
m=(m%mod-1)%mod;//求(n-1)
cout<<pow_mod(2,m,mod)<<endl;
}
return 0;
}
找循环节的程序
#include<bits/stdc++.h> using namespace std; typedef long long ll; #define mod 1000000007 int main() { int i; ll val=1; for(i=1;i<=mod;i++) { val*=2; val%=mod; if(val==1) { cout<<i<<endl; break; } } return 0; }