2017 Multi-University Training Contest 6.Funny Function(快速幂)

链接:http://acm.hdu.edu.cn/showproblem.php?pid=6050

分析:最简单的做法就是一个个求。。先求出F1,n=[2^n-(-1)^n]/3,然后F2,n就是对上面的N项求和,结果是F2,n=[(2^N-1)*2^n+((-1)^N-1)/2*(-1)^n]/3,向下归纳证明,Fm,n=[(2^N-1)^(m-1)*2^n+(((-1)^N-1)/2)^(m-1)*(-1)^n]/3,直接快速幂搞一下就出来了。。

标答是利用矩阵。

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 using namespace std;
 5 const int p=1e9+7;
 6 typedef unsigned long long ll;
 7 ll qpow(ll a,ll n){
 8     ll res=1,y=a,k=1;
 9     while(k!=0&&k<=n){
10         if(k&n){
11             res=(res*y)%p;
12         }
13         y=(y*y)%p;
14         k<<=1;
15     }
16     return res;
17 }
18 int main(){
19     //freopen("e:\\in.txt","r",stdin);
20     int t;
21     ll n,m;
22     scanf("%d",&t);
23     while(t--){
24         cin>>n>>m;
25         ll ans=0;
26         ll x;
27         x=qpow(2,n);
28         x=(x+p-1)%p;
29         ans=(qpow(x,m-1)*2)%p;
30         if(n%2==1){
31             ans=(ans+1)%p;
32         }
33         ans=(ans*333333336)%p;
34         cout<<ans<<endl;
35     }
36     return 0;
37 }

 

posted @ 2017-07-28 14:06  7391_KID  阅读(181)  评论(0编辑  收藏  举报