NOI能量采集
2016-05-10 11:30
239 查看
http://www.lydsy.com/JudgeOnline/problem.php?id=2005
这道题第一个想到了一种解法,和挑战上求线段的格点数一样,只要求出gcd(x-0,y-0)-1就是当前点的于(0,0)点的格点数,于是这里只要枚举x,y即可求解。。80的算法。。对于数据大的会超时。。下面先附上算法。
然后又100分的算法。。(0,0)到(x,y)上的整点个数为gcd(x,y)枚举g,求最大公约数为g的数对的个数,最后求和。f[g]表示最大公约数为g的数对的个数。然后我们需要去掉重复计算的部分,根据容斥定理有:
f[g]=[n/g]*[m/g]-f[g*2]-f[g*3]-f[g*4]…
下面附上代码,
注意会爆int。因为n*m=1e10;
这道题第一个想到了一种解法,和挑战上求线段的格点数一样,只要求出gcd(x-0,y-0)-1就是当前点的于(0,0)点的格点数,于是这里只要枚举x,y即可求解。。80的算法。。对于数据大的会超时。。下面先附上算法。
#include<iostream> #include<cstdio> #include<queue> #include<algorithm> #include<set> #include<map> using namespace std; int gcd(int a,int b) { if(b==0) return a; else return gcd(b,a%b); } int main() { int n,m; scanf("%d%d",&n,&m); int sum=0; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { int x=gcd(i,j)-1; sum+=2*x+1; } } printf("%d\n",sum); return 0; }
然后又100分的算法。。(0,0)到(x,y)上的整点个数为gcd(x,y)枚举g,求最大公约数为g的数对的个数,最后求和。f[g]表示最大公约数为g的数对的个数。然后我们需要去掉重复计算的部分,根据容斥定理有:
f[g]=[n/g]*[m/g]-f[g*2]-f[g*3]-f[g*4]…
下面附上代码,
注意会爆int。因为n*m=1e10;
#include<iostream> #include<cstdio> #include<queue> #include<algorithm> using namespace std; typedef long long ll; const int maxn=1e5+10; ll f[maxn]; int main() { ll n,m; scanf("%lld%lld",&n,&m); ll t=min(n,m); for(int i=t;i;i--) { f[i]=(n/i)*(m/i); for(int j=2*i;j<=t;j+=i) f[i]-=f[j]; } ll ans=0; for(int i=t;i;i--) { ans+=f[i]*(2*i-1); } printf("%lld\n",ans); return 0; }
相关文章推荐
- 使用border-image实现类似iOS7的1px底边
- iOS开发-解决页面卡顿小技巧(很常用)
- js/jsp操作cookie的方法
- 2016最新前端开发学习资料集锦
- 图像处理感想
- Asp.net后台调用前台JS函数实现
- 64位win2003 IIS6运行32位的.NET程序
- Mac下启动和停止Mysql服务
- iOS statusbar颜色
- 【BZOJ-2440】完全平方数 容斥原理 + 线性筛莫比乌斯反演函数 + 二分判定
- java Timer 定时每天凌晨1点执行任务
- Cucumber 相关资源
- CDISC SDTM EC/EX domain 学习笔记 - 2
- 详情页JS特效:往下滚动时,侧边新闻随着固定显示
- 上传头像的处理
- 运维新手 公司中的第一次 搭建tomcat和部署jdk服务
- Xcode升级7.3 编译时出错Cannot create __weak reference in file using manual
- ASP.NET解决方案 添加现有文件夹到项目解决方案
- IE6兼容性问题及解决办法汇总
- MYSQL数据库备份与恢复