bzoj 2005: [Noi2010]能量采集
2016-03-18 22:30
357 查看
#include<cstdio> #include<iostream> #define ll long long using namespace std; ll f[100009],n,m,ans; int main() { scanf("%d%d",&n,&m); if(n>m) swap(n,m); for(int i=n;i;i--) { f[i]=(n/i)*(m/i); for(int j=2;j*i<=n;j++) f[i]-=f[i*j]; ans+=f[i]*(2*i-1); } printf("%lld\n",ans); return 0; }
有个结论,(x,y)线段上的端点个数等于gcd(x,y),证明就自己yy一下吧,然后这个题就变成了gcd的和,设f[i]为gcd为i的点对有多少个,可用程序中方法nlogn求出。
相关文章推荐
- <我的C++程序>简单的学生信息管理系统
- 最长上升子序列、最长公共上升子序列
- Linux系统程序包管理工具 RPM
- 2016蓝桥杯假期任务之《打印十字图》
- android学习——activity实现动画切换
- 顺序表(C语言)
- C#高级编程 (第六版) 学习 第七章:委托和事件
- web服务文件更新自动同步、数据库主从复制、shell脚本实现网站代码备份和mysql备份
- BZOJ 2555: SubString
- 获取字符串或数组元素
- markdown简明语法
- Linux Shell 编程语法
- 添加和删除元素:
- 第三周作业(软件项目与过程管理)
- ABB机器人学习笔记1-软件使用
- loadrunner报错27794
- iOS个人整理29-JSON与xml文件解析
- oracle 11g listener.ora和tnsname.ora配置模板(IP地址方式)
- iOS--AVFoundation原生二维码与一维码扫描
- Object-C非正式协议与正式协议的区别