Product of Arithmetic Progression

题目链接

题意

(x) * (x+d) * (x+2d) * ... * (x+(n-1)d)

分析

1.显然,当d为0时,结果为x的n次方
2.很容易想到从上式中提取一个d出来,这样上式就转化为了:

ans = (x/d) * (x/d+1) * (x/d+2) * ... * (x/d+(n-1))

由于题目要求我们在对p取模的情况下运算,由逆元的知识得:

\frac{x}{d} \mod p= x*d^{p-2} \mod p

故有:

ans = (x*d^{p-2}) * (x*d^{p-2}+1) * (x*d^{p-2}+2) * ... * (x*d^{p-2}+(n-1))

即公差为1的整数等差数列

如果有x*d^{p-2}+(n-1) \geq p,则上式中必然有一项x*d^{p-2}+m = p,(m \leqslant N-1),此时ans为0

否则有:

ans =\frac{ (x*d^{p-2}+n-1)!}{(x*d^{p-2}-1)!}

预处理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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值