博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
YYHS-NOIP模拟赛-gcd
阅读量:6413 次
发布时间:2019-06-23

本文共 1617 字,大约阅读时间需要 5 分钟。

 

 

题解 

这道题题解里说用莫比乌斯反演做(我这个蒟蒻怎么会做呢)

但是不会,所以我们另想方法,这里我们用容斥来做

我们先把500000以内的所有质数筛出来

每次读入编号的时候,先把编号对应的这个数分解质因数

然后我们dfs枚举这个数的质因子取或不取,我们用t来表示取的质因子个数,如果t为奇数,ans就加,反之就减()

1 #include
2 #define N 200005 3 #define M 500005 4 #define ll long long 5 using namespace std; 6 int n,m,num,x,cnt,tot; 7 ll ans,s; 8 int a[N]; 9 int prime[M],Count[M];10 int t[100];11 bool flag[M],Flag[M];12 void dfs(int now,int num,int mul,int p){13 if (now>tot){14 if (!p) Count[mul]--;15 ans+=num*Count[mul];16 if (p) Count[mul]++; 17 return;18 }19 dfs(now+1,num,mul,p);20 dfs(now+1,-num,mul*t[now],p);21 }22 int main(){23 scanf("%d%d",&n,&m);24 for (int i=1;i<=n;i++)25 scanf("%d",&a[i]);26 int d=M-5;27 flag[1]=true;28 for (int i=2;i<=d;i++){29 if (!flag[i]) prime[++cnt]=i;30 for (int j=1;j<=cnt&&i*prime[j]<=d;j++){31 flag[i*prime[j]]=true;32 if (!(i%prime[j])) break;33 }34 }35 ans=0;36 for (int i=1;i<=m;i++){37 scanf("%d",&x);38 int k=a[x],num=1;39 tot=0;40 while (k>=prime[num]&&num<=cnt){41 if (!flag[k]){42 t[++tot]=k; k=1;43 break;44 }45 if (k%prime[num]==0) t[++tot]=prime[num];46 while (k%prime[num]==0) k/=prime[num];47 num++;48 }49 if (Flag[x]) dfs(1,-1,1,0); 50 else dfs(1,1,1,1);51 Flag[x]^=1;52 printf("%lld\n",ans);53 } 54 return 0;55 }
View Code

 

转载于:https://www.cnblogs.com/zhuchenrui/p/7693862.html

你可能感兴趣的文章
前端面试js(语法)
查看>>
读取本地HTML的小说阅读器应用源码项目
查看>>
手动安装K8s第七节:node节点部署-kube-proxy
查看>>
我的Git忽略文件
查看>>
运维监控利器Nagios之:安装nagios
查看>>
利用脚本批量修改h3C交换机super3的密码
查看>>
system: system error facility
查看>>
OSQA开发日志
查看>>
Spring源码阅读-通用配置实现AOP
查看>>
Nginx 日志切割
查看>>
keepalived安装问题记录
查看>>
zabbix low level discovery example use python(web_site_url)
查看>>
分布式服务Dubbo+Zookeeper安全认证
查看>>
我的友情链接
查看>>
request.getRequestURI() 、request.getRequestURL()
查看>>
二叉查找树--查找、删除、插入(Java实现)
查看>>
简单的UDP多线程模型
查看>>
Unity曲线编辑器和bezier曲线插值
查看>>
sql注入 与 预防
查看>>
Rockscluster 删除 autofs 自动挂载点home
查看>>