NOI2013矩阵游戏

这就是区分高中生和小学生爸爸的题目吧。

推导扣一个网上的式子吧

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int mod=1e9+7;
 4 typedef long long ll;
 5 ll a,b,c,d;
 6 ll qmod(ll x,ll y)
 7 {
 8     ll ans=1;
 9     while(y)
10     {
11         if(y&1)ans=x*ans%mod;
12         x=x*x%mod;y>>=1;
13     }
14     return ans;
15 }
16 struct numb
17 {
18     ll pow,mul;
19     numb(){pow=mul=0;}
20 }n,m;
21 numb read()
22 {
23     char ch;ch=getchar();numb a;
24     while(ch>'9'||ch<'0')ch=getchar();
25     while(ch<='9'&&ch>='0')
26     {
27         a.mul=(a.mul*10%mod+ch-'0')%mod;
28         a.pow=(a.pow*10%(mod-1)+ch-'0')%(mod-1);
29         ch=getchar();
30     }
31     return a;
32 }
33 int main()
34 {
35     n=read();m=read();
36     scanf("%lld%lld%lld%lld",&a,&b,&c,&d);
37     if(a==1)
38     {
39         b=(c*b%mod*(m.mul-1)%mod+d)%mod;
40         a=c;
41     }
42     else
43     {
44         b=(b*(qmod(a,m.pow-1)-1)%mod*qmod(a-1,mod-2)%mod*c%mod+d)%mod;
45         a=c*qmod(a,m.pow-1)%mod;
46     }
47     if(a==1)
48     {
49         b=(1+b*n.mul%mod)%mod;
50     }
51     else
52     {
53         b=(qmod(a,n.pow)+b*(qmod(a,n.pow)-1)%mod*qmod(a-1,mod-2)%mod)%mod;
54     }
55     printf("%lld\n",(b-d+mod)%mod*qmod(c,mod-2)%mod);
56     return 0;
57 }

 

posted @ 2018-02-28 15:56  大奕哥&VANE  阅读(295)  评论(0编辑  收藏  举报