一、题目描述:
一个正整数
定义一个可重集
由于答案可能很大,请对
二、解题思路:
思路不是我的,我是看一个同学的代码看懂的。
其实比较容易想到要统计素数个数,合数个数,然后套组合数多重集的板子。
但是方案数很多,甚至可能有
说到方案数,其实是一个计数
用一个类似背包的数组
但实际上并不完全是这样,因为有一部分质数也有可能做质数,所以还乘了逆元。看代码就知道了。时间复杂度
三、完整代码:
1 #include<iostream> 2 #define N 4050 3 #define M 1000010 4 #define lim 1000000 5 #define ll long long 6 #define mod 998244353 7 using namespace std; 8 ll n,cp,cc,cnt,ans; 9 ll a[N],s[M],v1[M],v2[M],pri[M]; 10 ll jc[M],inv[M],f[N][N],p[N],c[N]; 11 void Prime() 12 { 13 for(ll i=2;i<=lim;i++) 14 { 15 if(!v1[i]) pri[++cnt]=i; 16 for(ll j=1;j<=cnt;j++) 17 { 18 if(i*pri[j]>lim) 19 break; 20 v1[i*pri[j]]=1; 21 if(i%pri[j]==0) 22 break; 23 } 24 } 25 } 26 ll qsm(ll base,ll q) 27 { 28 ll res=1; 29 while(q) 30 { 31 if(q&1) res*=base,res%=mod; 32 base*=base,base%=mod,q>>=1; 33 } 34 return res; 35 } 36 void pre_work() 37 { 38 Prime(); 39 v1[1]=jc[0]=1; 40 for(ll i=1;i<=lim;i++) 41 jc[i]=jc[i-1]*i%mod; 42 inv[lim]=qsm(jc[lim],mod-2); 43 for(ll i=lim;i>=1;i--) 44 inv[i-1]=inv[i]*i%mod; 45 } 46 int main() 47 { 48 ios::sync_with_stdio(false); 49 cin.tie(0);cout.tie(0); 50 cin>>n;pre_work(); 51 for(ll i=1;i<=n*2;i++) 52 { 53 cin>>a[i],s[a[i]]++; 54 if(!v2[a[i]]) 55 if(!v1[a[i]]) p[++cp]=a[i],v2[a[i]]=1; 56 else c[++cc]=a[i],v2[a[i]]=1; 57 } 58 for(ll i=0;i<=cp;i++) 59 f[i][0]=1; 60 for(ll i=1;i<=cp;i++) 61 for(ll j=0;j<=n;j++) 62 { 63 f[i][j]=f[i-1][j-1]*inv[s[p[i]]-1]%mod; 64 (f[i][j]+=f[i-1][j]*inv[s[p[i]]])%=mod; 65 } 66 ans=f[cp][n]*jc[n]%mod; 67 for(ll i=1;i<=cc;i++) 68 (ans*=inv[s[c[i]]])%=mod; 69 cout<<ans<<'\n'; 70 return 0; 71 }
四、写题心得:
感觉有关阶乘,逆元的题都特别有意思,虽然我大多数都不会。不过加油吧!拜拜!
标签:
Codeforces
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】