社区讨论
泔水,求优化
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 条回复,欢迎继续交流。
正在加载回复...