您的位置:首页 > 其它

bzoj 3240: [Noi2013]矩阵游戏

2016-03-28 22:15 363 查看
题解戳这里

#include<bits/stdc++.h>
using namespace std;
const int maxn=1000005;
typedef long long ll;
const ll mod=1000000007;
ll a,b,c,d,Ans;
struct data{ll uni,ord;}n,m;
char s[maxn],t[maxn];
void init(char* ss,data& k){
int l=strlen(ss);
for(int i=0;i<l;++i){
k.uni=(k.uni*10+ss[i]-'0')%(mod-1);
k.ord=(k.ord*10+ss[i]-'0')%mod;
}
}
ll qpow(ll a,ll b){ll ans=1,aa=a;for(;b;b>>=1){if(b&1)ans=(ans*aa)%mod;aa=(aa*aa)%mod;}return ans;}
ll ni(ll a){return qpow(a%mod,mod-2);}
int main(){//freopen("in.in", "r", stdin);
scanf("%s%s",s,t);scanf("%lld%lld%lld%lld",&a,&b,&c,&d);
init(s,n);init(t,m);
if(a==1){
a=c;
b=((((c*b)%mod)*(m.ord-1))+d)%mod;
if(a==1) Ans=(1+n.ord*b)%mod;
else {ll tt=((qpow(a,n.uni)-1)*ni(a-1))%mod;
Ans=(qpow(a,n.uni)+b*tt)%mod;
}
}
else{ll tt=((qpow(a,m.uni-1)-1)*ni(a-1))%mod;
b=((c*b%mod)*tt+d)%mod;
a=(c*qpow(a,m.uni-1))%mod;
if(a==1) Ans=(1+n.ord*b)%mod;
else {ll tt=((qpow(a,n.uni)-1)*ni(a-1))%mod;
Ans=(qpow(a,n.uni)+b*tt)%mod;
}
}
printf("%lld",(((Ans-d)*ni(c))%mod+mod)%mod);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: