2017 Multi-University Training Contest 2 && HDOJ 6050 Funny Function 【思维+快速幂】
2017-07-27 21:17
489 查看
Funny Function
Time Limit: 2000/1000 MS (Java/Others) Memory Limit:32768/32768 K (Java/Others)Total Submission(s): 284 Accepted Submission(s): 121
Problem Description
Function Fx,y satisfies:
For given integers N and M,calculate
Fm,1 modulo 1e9+7.
Input
There is one integer T in the first line.
The next T lines,each line includes two integers N and M .
1<=T<=10000,1<=N,M<2^63.
Output
For each given N and M,print the answer in a single line.
Sample Input
2
2 2
3 3
Sample Output
2
33
【题意】给出递推公式,递推公式与n有关,求F[m][1]的值。
【思路】这道题我们可以经过打表发现最终的递推公式与n有关:
当n为偶数时:F(m,1)=(2^n -1)^(m-1)*2/3
当n为奇数时:F(m,1)=((2^n -1)^(m-1)*2+1)/3
这样的话可以直接利用快速幂求解,值得注意的是,这里涉及到除法取膜,由于除法取膜不满足公式,所以要求3对于1e9+7的逆元,由拓展欧几里得算法或者费马小定理可以得到逆元为333333336,代入即可。
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define mst(a,b) memset((a),(b),sizeof(a)) #define rush() int T;scanf("%d",&T);while(T--) typedef unsigned long long ll; const int maxn = 100005; const ll mod = 1e9+7; const ll inv = 333333336; const int INF = 0x3f3f3f; const double eps = 1e-9; ll fast_mod(ll a,ll b,ll Mod) { ll ans=1; a%=Mod; while(b) { if(b&1) ans=(ans*a)%Mod; b>>=1; a=(a*a)%Mod; } return ans; } int main() { ll n,m; rush() { scanf("%I64d%I64d",&n,&m); if(m==1) { puts("1"); continue; } ll temp=(fast_mod(2,n,mod)-1+mod)%mod; ll ans; if(n&1) { ans=(2*fast_mod(temp,m-1,mod)+1)*inv%mod; } else { ans=2*fast_mod(temp,m-1,mod)*inv%mod; } printf("%I64d\n",ans); } return 0; }
相关文章推荐
- hdoj 6050(2017 Multi-University Training Contest - Team 2) Funny Function
- 2017 Multi-University Training Contest - Team 2 :1006 Funny Function(找规律+逆元+快速幂取模)
- 2017 Multi-University Training Contest 1 && HDOJ 6038 Function 【强连通找环】
- HDU 6050 - Funny Function | 2017 Multi-University Training Contest 2
- HDU 6050 Funny Function(构造矩阵+推公式)——2017 Multi-University Training Contest - Team 2
- 2017 Multi-University Training Contest 7 && HDU 6121 Build a tree 【思维】
- 2017 Multi-University Training Contest - Team 1 1006 Function(思维 循环节)
- 2017 Multi-University Training Contest 6 && HDOJ 6105 Gameia 【树形博弈】
- 2017 Multi-University Training Contest 4 && HDOJ 6069 Counting Divisors 【区间筛法】
- 2017 Multi-University Training Contest 3 && HDOJ 6058 Kanade's sum 【链表模拟】
- 2017 Multi-University Training Contest 1 && HDOJ 6035 Colorful Tree 【搜索】
- 2017 Multi-University Training Contest 5 &&HDU 6085 Rikka with Candies 【bitset+思维】
- 2017 Multi-University Training Contest 1 && HDOJ 6034 Balala Power! 【贪心】
- 2017 Multi-University Training Contest - Team 1 1006&&HDU 6038 Function【DFS+数论】
- 2017 Multi-University Training Contest 2 && HDOJ 6053 TrickGCD 【容斥+莫比乌斯函数】
- 2017 Multi-University Training Contest 9 && HDU 6166 Senior Pan 【最短路+思维】
- 2017 Multi-University Training Contest - Team 2 hdu6050 Funny Function 矩阵快速幂
- hdoj 6060(2017 Multi-University Training Contest - Team 3) RXD and dividing
- 2017 Multi-University Training Contest - Team 4:1009&hdu6075、Questionnaire
- 2017 Multi-University Training Contest - Team 4 :1003&hdu6069、Counting Divisors