求循环节的方法:
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;
}