题目链接:http://acm.scu.edu.cn/soj/problem.action?id=4492
分析:其实明显是找规律的题目静下心来慢慢找会比较好,另此题用到了欧拉函数所以数学菜鸡表示有点头疼。之前卡了半天的输出问题其实只是变量打错了(泪奔)。具体推导过程参见吕爷博客:http://www.expmango.com/156/2016scu_xiao_sai_scu4492_bored_gong_shi_tui_dao.html
AC代码:
#include<iostream>
#include<cmath>
//const long long mod2=410338673;//17^7
using namespace std;
long long regcd(long long a,long long b,long long &x,long long &y){
long long ans,t;
if(b==0){
x=1;y=0;
return a;
}
ans=regcd(b,a%b,x,y);
t=x;x=y;y=t-(a/b)*y;
return ans;
}
long long las(long long a,long long m){
long long x,y,d;
d=regcd(a,m,x,y);
if(d==1){
return (x%m+m)%m;
}
else return -1;
}
long long fastpow(long long m,long long n,long long md){
long long ans=1;
long long temp=m%md;
while(n){
if(n&1) ans*=temp;
ans%=md;
temp*=temp;
temp%=md;
n>>=1;
}
return ans%md;
}
int eul(int n){
int ret=n,a=n;
for(int i=2;i*i<=a;i++){
if(a%i==0){
ret=ret/i*(i-1);
while(a%i==0) a/=i;
}
}
if(a>1) ret=ret/a*(a-1);
return ret;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
long long t;
long long m,n;
while(cin>>t){
if(t==0){
cout<<0<<endl;
continue;
}
int md2=fastpow(17,7,1000000000LL);
int e=eul(md2);
m=fastpow(10,t,e);
n=m/2;
long long ans1=2LL*fastpow(16,n-1,md2);
long long lap=fastpow(4,n+1,md2)*(fastpow(4,n-1,md2)-1LL)%md2*las(3,md2)%md2;
long long side=14*(fastpow(16,n-1,md2)-1LL)%md2*las(15,md2)%md2;
long long ans=(ans1+lap-side+md2)%md2;
cout<<ans<<endl;
}
return 0;
}