hdu4704 迴圈節+快速冪
阿新 • • 發佈:2019-01-08
求迴圈節的方法:
void getj()
{
ll a1=2,a2=4;
for(ll i=2;;i++)
{
a1=(2*a1)%Mod;
a2=(2*a2)%Mod;
if(a1==2&&a2==4)
{
cout<<i-1<<endl;
break;
}
}
}
程式碼:
#include<iostream> #include<cstdio> #include<vector> #include<string> #include<queue> #include<cstring> #define maxn 10005 #define INF 0xfffffff #define mem(a,b) memset(a,b,sizeof(a)) #define FOR(i,s,t) for(int i=s;i<=t;i++) #define ull unsigned long long #define ll __int64 #define Mod 1000000007 #define mj 500000003 using namespace std; int c[maxn]; ll POW(ll x,ll n,ll mod) { ll ret=1; while(n) { if(n&1) { ret=(ret*x)%mod; } n/=2; x=(x*x)%mod; } return ret; } ll fun(char *s) { ll ret=0; ll l=strlen(s); for(int i=0;i<l;i++) { ret=(ret+(s[i]-'0')*POW(10,l-i-1,mj))%mj; } return ret; } void getj() { ll a1=2,a2=4; for(ll i=2;;i++) { a1=(2*a1)%Mod; a2=(2*a2)%Mod; if(a1==2&&a2==4) { cout<<i-1<<endl; break; } } } int main() { ll n; while(scanf("%s",s)!=EOF) { n=fun(s); printf("%I64d\n",POW(2,n-1+mj,Mod)); } return 0; }