思路:就是用快速幂解决等比数列的时间问题,等差就套公式…
快速幂就是把次数依次化为2进制,即可迭代
龟速乘即为把当前数变为2进制加起来,用于数据很大的情况
复杂度O(nlogn)
code:
#include<bits/stdc++.h>
typedef long long LL;//这里类似于宏定义
using namespace std;
const LL mod = 200907;//定义一个常量记mod
LL qadd(LL a,LL b){
LL res=0;
while(b){
if(b&1)//如果幂的2进制末尾是1
res=(res+a)%mod;
a=(a+a)%mod;
b>>=1;//退一位
}
return res;
}
LL qmi(LL a,LL b){
LL res=1;
while(b){
if(b&1) res=(res*a)%mod;
b>>=1;//等于2进制中把最后一位删了
a=a*a%mod;//更新当前的数
}
return res;
}
int main(){
int T;
cin>>T;
while(T--){
LL a,b,c,x;
scanf("%lld%lld%lld%lld",&a,&b,&c,&x);
if(a+c==b+b) cout<<qadd(b-a,x-1)+a<<"\n";//为等差即套公式,首项+公差*(项数-1)
else cout<<qmi(b/a,x-1)*a%mod<<"\n";//等比数列用快速幂算末项
//等比的话就是那个“比”的x-1次幂再加上首项就好了
}
return 0;
}
没有打空格的习惯,多多指教n(≧▽≦)n
不打空格是个坏习惯,╭(╯^╰)╮