社区讨论

泔水,求优化

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

讨论操作

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

当前回复
41 条
当前快照
1 份
快照标识符
@mkfptgnn
此快照首次捕获于
2026/01/16 01:20
上个月
此快照最后确认于
2026/01/18 16:25
上个月
查看原帖
代码写的像泔水一样。
有没有佬看一下这个代码的实现是不是复杂了,有没有更优秀的写法,或者代码实现上有没有可以简化的地方。
代码已经给 Deepsuck Deepseek 看过一遍并且手动修改过了。
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10;
const int inf=1e18+7;
int qp(int x,int y,int p){
	int ans=1;
	while(y){
		if(y&1) ans=ans*x%p;
		x=x*x%p;
		y>>=1;
	}
	return ans;
}
int eg(int a,int b,int &x,int &y){
	if(!b){
		x=1,y=0;
		return a;
	}
	int d=eg(b,a%b,y,x);
	y-=(a/b)*x;
	return d;
}
int inv(int c,int p){
	int x,y;
	eg(c,p,x,y);
	return (x%p+p)%p;
}
struct ds{
	int s[N],p,k,r;
	int ca(int n){
		if(n<p) return s[n];
		return ca(n/p)*qp(s[p-1],n/p,r)%r*s[n%p]%r;
	}
	int re(int x){
		if(x<p) return 0;
		return re(x/p)+(x/p);
	}
	int sec(int n,int m,int x,int y){
		p=x,k=y,r=qp(x,y,inf);
		int c=re(n)-re(m)-re(n-m);
		s[0]=1;
		for(int i=1;i<r;i++){
			s[i]=s[i-1];
			if(i%p) s[i]=s[i]*i%r;
		}
		int ans=qp(p,c,r);
		int d1=ca(n);
		int d2=ca(n-m);
		int d3=ca(m);
		return ans*d1%r*inv(d2,r)%r*inv(d3,r)%r;
	}
};
struct exlucas{
	ds s;
	vector<pair<int,int>> dec(int x){
		vector<pair<int,int>> res;
		for(int i=2;i*i<=x;i++){
			if(x%i==0){
				int cnt=0;
				while(x%i==0){
					x/=i;
					cnt++;
				}
				res.push_back({i,cnt});
			}
		}
		if(x!=1) res.push_back({x,1});
		return res;
	}
	int sol(int n,int m,int p){
		auto r=dec(p);
		vector<pair<int,int>> g;
		for(auto [x,y]:r){
			int a=s.sec(n,m,x,y);
			int mod=qp(x,y,inf);
			g.push_back({a,mod});
		}
		int ans=0;
		for(auto [a,mod]:g){
			int w=p/mod;
			int iw=inv(w,mod);
			ans=(ans+a*w%p*iw%p)%p;
		}
		return ans;
	}
}t;
int n,m,p;
signed main(){
	ios::sync_with_stdio(0),cin.tie(0);
	cin>>n>>m>>p;
	cout<<t.sol(n,m,p)<<"\n";
}

回复

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

正在加载回复...