Processing math: 100%

题解 CF1559E 【Mocha and Stars】

推广个人博客,欢迎大家来玩。

题目意思:

给定 nm,求 n 个数满足以下 3 个条件的方案数(对 998244353 取模):

  1. liairi(1in)
  2. ni=1aim
  3. gcd(a1,a2,,an)=1

考虑对 gcd 大力容斥,这样就变成了让 gcd(a1,a2,,an) 为某个数的倍数的方案数,因为 gcd 要为某个数的倍数。所以 ai 必须为那个数的倍数,我们可以考虑直接除一下。

考虑 dpfi,j 表示前 i 个质数和(除了之后)为 j 的方案数。

求出每个数的合法区间(除来之后的),枚举它,设它为 k,转移就是 fi,jfi1,jk

最后再提一下,容斥乘的数是 μ

Copy
#include<bits/stdc++.h> #define log(a) cerr<<"\033[32m[DEBUG] "<<#a<<'='<<(a)<<" @ line "<<__LINE__<<"\033[0m"<<endl #define int long long #define SZ(x) ((int)x.size()-1) #define ms(a,b) memset(a,b,sizeof a) #define F(i,a,b) for(int i=(a);i<=(b);++i) #define DF(i,a,b) for(int i=(a);i>=(b);--i) using namespace std; inline int read(){char ch=getchar(); int w=1,c=0; for(;!isdigit(ch);ch=getchar()) if (ch=='-') w=-1; for(;isdigit(ch);ch=getchar()) c=(c<<1)+(c<<3)+(ch^48); return w*c; } const int N=55,M=1e5+10,MOD=998244353; int l[N],r[N],ll[N],rr[N],prim[M],cnt,s[M]; bool is[M]; int f[N][M],g[N][M],ans,h[M]; signed main(){ int n=read(),m=read(); h[1]=1; F(i,2,m){ if(!is[i]){ h[i]=-1; prim[++cnt]=i; } for(int j=1;j<=cnt&&i*prim[j]<m;j++){ is[i*prim[j]]=1; if(i%prim[j]==0)break; h[i*prim[j]]=-h[i]; } } F(i,1,n)l[i]=read(),r[i]=read(); F(_,1,m/n){ F(i,1,n){ if(l[i]%_==0)ll[i]=l[i]/_; else ll[i]=l[i]/_+1; rr[i]=r[i]/_; } F(i,1,m/_)f[1][i]=0; F(i,ll[1],rr[1])f[1][i]=1; F(i,2,n){ F(j,1,m/_) s[j]=(s[j-1]+f[i-1][j])%MOD; F(j,ll[i],m/_) f[i][j]=(s[j-ll[i]]-s[j-min(j-1,rr[i])-1]+MOD)%MOD; } int s=0; F(i,1,m/_)s=(s+f[n][i])%MOD; ans=(ans+s*h[_]+MOD)%MOD; }cout<<ans; return 0; }
  • Update:复杂度分析:

    我们把枚举容斥的数设为 x,一次 dp,和的上限是 mx。所以单次 dp 的复杂度是 O(n×mx),但 x 会从 1 一直到 mn

    即:

    mnx=1n×mx=n×mmnx=11x=n×m×logmn

posted @   zhaohaikun  阅读(92)  评论(0编辑  收藏  举报
编辑推荐:
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· 程序员常用高效实用工具推荐,办公效率提升利器!
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 【译】WinForms:分析一下(我用 Visual Basic 写的)
点击右上角即可分享
微信分享提示