博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 5212 Code
阅读量:6931 次
发布时间:2019-06-27

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

 

筛法。

统计所有 [数] 的所有 [倍数] 的 [数] 的个数,即 i 的所有倍数 i, 2i, 3i, 4i...个数为 dp[i],

则所有 倍数两两结合共有 dp[i] * dp[i] 个。

此处覆盖 dp[i] = dp[i] * dp[i]。

对于新的 dp[i] 数组,从后往前逆推,设已完成的子问题 d[j] 为 j 作为 [最大公约数] 的所有数对的个数。

因为 dp[i] 是所有以 i 为 [公约数] 的数对个数,dp[i] 去掉 [ i 是公约数] 但 [ i 不是最大公约数] 的那些数对的个数(即所有的 [ j 是 i 的倍数 ] 的d[j])则得到 d[i](代码中相当于 d[i] 覆盖 dp[i])。

1 #include
2 #include
3 #include
4 typedef long long LL; 5 int dp[11111]; 6 int num[11111]; 7 int sum[11111]; 8 int n; 9 int main()10 {11 while(scanf("%d", &n) != EOF)12 {13 int maxnum = 0, ans = 0;14 memset(sum, 0, sizeof(sum));15 for(int i = 0; i < n; i ++)16 {17 scanf("%d", &num[i]);18 sum[num[i]] ++;19 maxnum = maxnum < num[i] ? num[i] : maxnum;20 }21 memset(dp, 0, sizeof(dp));22 for(int i = 2; i <= maxnum; i ++)23 {24 25 for(int j = i; j <= maxnum; j += i)26 {27 dp[i] += sum[j];28 }29 dp[i] *= dp[i];30 }31 for(int i = maxnum; i >= 2; i --)32 {33 for(int j = i + i; j <= maxnum; j += i)34 dp[i] -= dp[j];35 ans = (ans + (LL)i * (i - 1) * dp[i]) % 10007;36 }37 printf("%d\n", ans);38 }39 return 0;40 }

 

转载于:https://www.cnblogs.com/CSGrandeur/p/4459438.html

你可能感兴趣的文章
button 默认类型是submit
查看>>
数据结构与算法(周鹏-未出版)-第六章 树-6.2 二叉树
查看>>
<转>大型分布式网站术语浅析
查看>>
Java多线程之并发协作生产者消费者设计模式
查看>>
[置顶] 如何把你的笔记本电脑变成一个Wi-Fi路由器在Windows 7 & 8?
查看>>
Linux 查看CPU信息、机器型号等硬件信息
查看>>
实时检验您的页面是否符合XHTML标准——使用Validator Module
查看>>
python List&Set&Dict交集、并集、差集
查看>>
alienware Win8 系统安装
查看>>
一起谈.NET技术,不要在using语句中调用WCF服务
查看>>
四大最被高估的安全技术 用户感觉良好其实不然
查看>>
分析称iPhone漏洞或致手机受钓鱼攻击
查看>>
浅析Google Chrome 2.0浏览器安全性能
查看>>
WPF中使用amCharts绘制“.NET技术”股票K线图
查看>>
不开辟用于交换数据的临时空间,如何完成字符串的逆序
查看>>
分析网站配色的Firefox插件[前端工具]
查看>>
版本控制-git
查看>>
一个最新发现,原来程序员的最终归宿在这里。
查看>>
Tessnet2图片识别(2)
查看>>
webSocket ws协议测试
查看>>