5875: 桃子的难题(等比数列二分求和)

描述

 

taozi喜欢数学,但是遇到数学题就头疼,zdragon为了让大家高兴高兴,给taozi出了道难题:

S=∑q(1≤i≤n),由于答案可能会很大,答案对p取模。

 

输入

 

输入第一行为测试样例组数T(1≤T≤100)。

对于每组数据第一行包含三个正整数n,q,p(1≤n,q,p≤109)。

 

输出

 

对于每组数据,输出一个S对p取模的值。

 

样例输入

样例输出

提示

 

对于第一个样例,21+22+23=14,对100取模,答案为14。


 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int t,n,q,p;
 4 typedef long long ll;
 5 
 6 ll power(ll n,ll q,ll p){
 7     ll num=1;
 8     q%=p;
 9     while(n){
10         if(n&1) num=num*q%p;
11         q=q*q%p;
12         n/=2;
13     }
14     return num;
15 }
16 
17 ll sum(ll n,ll q,ll p){
18     if(n==1) return q;
19     ll t=sum(n/2,q,p);
20     if(n&1){  //为奇数
21         ll cur=power(n/2+1,q,p);
22         t=(t+t*cur%p)%p;
23         t=(t+cur)%p;
24     }
25     else{
26         ll cur=power(n/2,q,p);
27         t=(t+t*cur%p)%p;
28     }
29     return t;
30 }
31 int main()
32 {
33     ios::sync_with_stdio(false);
34     cin>>t;
35     while(t--){
36         cin>>n>>q>>p;
37         ll zhi=sum(n,q,p);
38         cout << zhi << endl;
39     }
40     return 0;
41 }
View Code

 

 
posted @ 2019-07-05 13:14  厂长在线养猪  Views(200)  Comments(0Edit  收藏  举报