[51nod1375]再选数
来源:互联网 发布:苹果数据大师破解版 编辑:程序博客网 时间:2024/06/10 12:28
Description
给出n个数,{a},求在其中选k个数使其gcd为1的方案数。
如果k=-1表示任意取,不过至少得取一个。
答案对998244353取模。
n<=10^5,ai<=10^6
Solution
记得某位dalao说过,看到gcd想到反演=w=
但这道题都能用反演?!涨姿势了~
开始一直在想容斥,想不出来,然后去Orz了栋爷的题解(数论蒟蒻不要鄙视我QwQ
然后看到第一句话就震惊了233
话说反演真的很好推呀!
设Fd表示gcd为d的方案数。
Gd表示gcd为d的倍数的方案数。
然后对每个数分解因数,求出有多少个数是d的倍数,那么用组合数就可以算出C了。
对于k=-1的情况预处理2的幂就好了,记得要-1,因为必须至少选一个。
然后就没有了,劲啊
Code
#include <cmath>#include <cstdio>#include <cstring>#include <algorithm>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)using namespace std;typedef long long ll;const int N=1e6+5,mo=998244353;int fact[N],inv[N],mi[N],cnt[N],g[N],mx,n,k,x,ans;int p[N],mu[N];bool bz[N];int c(int m,int n) { if (n>m) return 0; return (ll)fact[m]*inv[n]%mo*inv[m-n]%mo;}int main() { scanf("%d%d",&n,&k); fo(i,1,n) { scanf("%d",&x); mx=max(mx,x);int up=sqrt(x); fo(j,1,up) if (!(x%j)) { cnt[j]++; if (j*j!=x) cnt[x/j]++; } } fact[0]=inv[0]=mi[0]=inv[n]=1; fo(i,1,n) fact[i]=(ll)fact[i-1]*i%mo,mi[i]=mi[i-1]*2%mo; for(int y=mo-2,x=fact[n];y;y/=2,x=(ll)x*x%mo) if (y&1) inv[n]=(ll)inv[n]*x%mo; fd(i,n-1,1) inv[i]=(ll)inv[i+1]*(i+1)%mo; fo(i,2,mx) { if (!bz[i]) p[++p[0]]=i,mu[i]=-1; fo(j,1,p[0]) { int k=i*p[j];if (k>mx) break; bz[k]=1;if (!(i%p[j])) break; mu[k]=-mu[i]; } } mu[1]=1; fo(i,1,mx) if (k!=-1) g[i]=c(cnt[i],k);else g[i]=mi[cnt[i]]-1; fo(i,1,mx) (ans+=mu[i]*g[i])%=mo; printf("%d\n",(ans+mo)%mo);}
0 0
- [51nod1375]再选数
- [51nod1375]再选数
- [51nod 1375]再选数
- 多选框选到一定个数不能再选
- 先选行业,再选职业!
- 先选分类,再选待选项。
- 我dotNET 所以我 Skin (WinForm 控件再选)
- 再选择一项将来值得追求的方向
- 用80x86汇编语言编程:键盘输入数组,再选择输出
- 是去是留,去向何方——中职学生的再选择
- android 设置RadioGroup单选按钮选中后不能再选择
- 解决选择了一个Row,再选择另一个Row,- (void)tableView:didDeselectRowAtIndexPath:才响应
- 通过Ajax动态生成的页面,解决复选框,选择一次不能再选择的问题
- jquery完成列表中数据选择,以及进行所选数据的再选择
- jquery 操作checkBox 、radio 一次取消选中后不能再选中
- 为什么下载音乐要优先选择去google音乐下载,找不到之后再选择其它如:酷狗,百度?
- 两个单选按钮,选中一个后再选第二个时第一个还在,怎样取消?
- eclipse安装了adt之后再选择了sdk路径,工具栏里找不到sdk和avd的manager
- JAVA求指定素数合
- 关于Fedora 24 的 `dnf update`这个小故障
- 《Unity Shader 与 计算机图形学》第二章
- 纳什均衡
- [转]js 重写继承方法
- [51nod1375]再选数
- USACO2014MarchGold Counting Friends
- runtime解决button重复点击的bug
- Git的简单使用
- 积攒力量,继续折腾(16年年终总结)
- Android真机测试,连接到本地服务器的方法
- 在VMware中CentOS6.8的安装
- sql server 游标使用的一个坑
- 个人对js闭包的理解