题目链接
题意
求
分析
1.显然,当d为0时,结果为x的n次方
2.很容易想到从上式中提取一个d出来,这样上式就转化为了:
由于题目要求我们在对p取模的情况下运算,由逆元的知识得:
故有:
即公差为1的整数等差数列
如果有,则上式中必然有一项,此时ans为0
否则有:
预处理0~p的阶乘即可在O(log)的时间(快速幂的时间开销)完成每次询问
记得开longlong
代码
#include<iostream>
#include<cstdio>
using namespace std;
const long long MOD = 1000003;
long long n,x,d,T;
long long fac[1000020];
long long pw(long long a, long long b) {
long long ans = 1, base = a;
while(b > 0) {
if(b & 1) {
ans *= base;
ans %= MOD;
}
base *= base;
base %= MOD;
b >>= 1;
}
return ans;
}
int main() {
fac[0] = 1;
for(long long i = 1;i <= MOD;i++) {
fac[i] = (fac[i-1] * i) % MOD;
}
scanf("%lld",&T);
while(T--) {
scanf("%lld%lld%lld",&x,&d,&n);
if(!d) {
printf("%lld\n",pw(x,n));
continue;
}
long long xdd = x * pw(d,MOD-2) % MOD;// x/d在%mod下的等价变换
if(xdd + n - 1 >= MOD) {
printf("0\n");
continue;
}
long long ans = fac[xdd+n-1] * pw(fac[xdd-1],MOD-2) % MOD;
ans = ans*pw(d,n) % MOD;
printf("%lld\n",ans);
}
return 0;
}