对于两种序列一种等比,一种等差
如果是等比 ak = a1 + (k - 1) * d 直接用((a1 * mod) + ((k - 1) % mod) * (d % mod)) % mod求就可以了
如果是等差 ak = a1 * q ^(k - 1) 利用快速幂求出q ^(k - 1)可以得到结果
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; typedef long long LL; int n; int k; LL a[5]; LL mod = 200907; LL pow_mod(LL a,int m){ //printf("%d\n",m); if(m == 1) return a % mod; if(m == 0) return 1; LL d = pow_mod(a,m / 2); LL ans = d * d % mod; if(m & 1) ans = ans * a % mod; return ans; } int main(){ scanf("%d",&n); while(n--){ for(int i = 0; i < 3; i++) scanf("%I64d",&a[i]); scanf("%d",&k); LL ans; if(a[1] - a[0] == a[2] - a[1]){ ans = ((a[0] % mod) + ((k - 1) % mod) * ((a[1] - a[0]) % mod)) % mod; printf("%I64d\n",ans); } else{ LL d = a[1] / a[0]; ans = ((a[0] % mod) * pow_mod(d,k - 1)) % mod; printf("%I64d\n",ans); } } return 0; } /* 1 1 10 100 1000000000 */
时间: 2025-01-17 14:40:48