[51nod1375]再选数
来源:互联网 发布:辐射3 知乎 编辑:程序博客网 时间:2024/06/06 11:38
题目大意
有n个正整数,你可以从中选出k个数(k是给定的,如果k=-1则要选择至少一个),使它们的gcd=1。求方案数模998244353的值。
n≤100000 每个数≤1000000
分析
数的范围不是很大,可以考虑从中入手。
设f(d)为选择的数gcd为d的答案,g(d)表示gcd是d的倍数的答案。显然有g(d)=
看到这里想到了什么?!
答案就是f(1),剩下的是预处理g数组。
考虑k=-1的情况,假设有s(d)个数是d的倍数,那么
k≠-1时,
对读入的数根号复杂度枚举它的约数,然后统计答案是线性的。
#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int M=1000000,mo=998244353;typedef long long LL;int n,k,tot,pr[M+5],cnt[M+5],ans,Fac[M],Inv[M],Fac_Inv[M],P[M+5],mu[M+5];bool bz[M+5];char c;int read(){ for (c=getchar();c<'0' || c>'9';c=getchar()); int x=c-48; for (c=getchar();c>='0' && c<='9';c=getchar()) x=x*10+c-48; return x;}void init(){ mu[1]=1; for (int i=2;i<=M;i++) { if (!bz[i]) { pr[tot++]=i; mu[i]=-1; } for (int j=0;j<tot;j++) { int I=i*pr[j]; if (I>M) break; bz[I]=1; if (i%pr[j]==0) { mu[I]=0; break; } mu[I]=-mu[i]; } }}int C(int n,int m){ return (LL)Fac[n]*Fac_Inv[m]%mo*Fac_Inv[n-m]%mo;}int main(){ init(); scanf("%d%d",&n,&k); for (int i=1;i<=n;i++) { int x=read(),j; for (j=1;j*j<x;j++) if (x%j==0) { cnt[j]++; cnt[x/j]++; } if (j*j==x) cnt[j]++; } if (k==-1) { P[0]=1; for (int i=1;i<=n;i++) P[i]=P[i-1]*2%mo; for (int i=1;i<=M;i++) { ans=(ans+mu[i]*(P[cnt[i]]-1))%mo; } ans=(ans+mo)%mo; printf("%d\n",ans); return 0; } Fac[0]=Fac[1]=Fac_Inv[0]=Fac_Inv[1]=Inv[1]=1; for (int i=2;i<=n;i++) { Fac[i]=(LL)Fac[i-1]*i%mo; Inv[i]=(LL)Inv[mo%i]*(mo-mo/i)%mo; Fac_Inv[i]=(LL)Fac_Inv[i-1]*Inv[i]%mo; } for (int i=1;i<=M;i++) if (cnt[i]>=k) { ans=(ans+mu[i]*C(cnt[i],k))%mo; } ans=(ans+mo)%mo; printf("%d\n",ans); return 0;}
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_容器_Collections类
- 自然语言处理入门学习系列<一>
- Android Fragment使用 嵌套Fragments (Nested Fragments) 的使用及常见错误
- matlab 中值滤波
- poj_2195 Going Home(最小费用流)
- [51nod1375]再选数
- [android]与 ViewPager fragment里面fragment和 FragmentStatePagerAdapter 的结果,在异常 (与完整的示例)
- android 代码设置、打开wifi热点及热点的连接
- 用ls和du显示的文件大小为何有差别
- <HTML5> 新增的表单元素
- LeetCode09:Palindrome Number
- 工具链接
- spring mvc 使用kaptcha生成验证码
- Odd Even Linked List