社区讨论

一个似乎没有完全按照exLucas来的算法,50分求调

P4720【模板】扩展卢卡斯定理 / exLucas参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@loiix0r8
此快照首次捕获于
2023/11/03 19:19
2 年前
此快照最后确认于
2023/11/03 20:53
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
int prime[20000009],cnt;
bool is_prime[20000009];
int T,rett;
void read(int &x){
	char c=getchar();x=0;int f=0;
	for(;!isdigit(c);c=getchar()) f|=(c=='-');
	for(;isdigit(c);c=getchar()) x=((x<<3)+(x<<1)+(c^48));
	x=f? -x:x; 
}
void write(int x){
	if(x<0)putchar('-'),x=-x;
	if(x>9)write(x/10);
	putchar(x%10^48);
}
int n,m,p; 
void primes(int x){
	for(int i=2;i<=x;i++){
		if(!is_prime[i]){
			prime[++cnt]=i;
		}
		for(int j=1;j<=cnt&&i*prime[j]<=x;j++){
			is_prime[i*prime[j]]=1;
			if(i%prime[j]==0)break;
		}
	}
}
int qpow(int a,int b){
	int ret=1;
	while(b){
		if(b&1)ret=(ret*a)%p;
		a=(a*a)%p;b>>=1;
	}
	return ret;
}
int get_zhishu(int x,int y){
	int ret=0;
	while(x){ret+=x/y;x/=y;}
	return ret;
}
int C(int x,int y){
	int ret=1;
	for(int i=1;i<=cnt&&prime[i]<=x;i++){
		int op=prime[i];
		int zhishu=get_zhishu(x,op)-get_zhishu(y,op)-get_zhishu(x-y,op);
		ret=(ret*qpow(op,zhishu))%p;
	}
	return ret;
}
signed main(){
	read(n);read(m);read(p);
	primes(20000000);
	cout<<C(n,m);
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...