描述
taozi喜欢数学,但是遇到数学题就头疼,zdragon为了让大家高兴高兴,给taozi出了道难题:
S=∑qi (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 }