【BZOJ】2005 [Noi2010]能量采集
来源:互联网 发布:淘宝店铺的客服电话 编辑:程序博客网 时间:2024/05/17 09:34
[Noi2010]能量采集
题目链接
- [Noi2010]能量采集
题目大意
中文题,题目意思很清楚,这里就不说了,总之就是要你求这个:
题解
莫比乌斯反演 化简
可以化简:
可以看到现在的首要任务是求前面的和式,考虑到gcd(x,y)只有有限个值,我们设
当然x和y都在范围内。
这样的话我们的ans可以改写为:
看到首要任务是求
又因为:
根据反演公式,有:
到这里基本又是一些老东西了,令
把x换成d,再带入ans,得到:
到这里,我们的
这个可以用用欧拉函数的性质
可以看到最后的式子非常简单,先筛出
代码
不能用%I64d,会WA
#include <iostream>#include <cstring>#include <cstdio>#define LL long long#define maxn 100005using namespace std;LL n,m,p[maxn-5],cnt,phi[maxn];bool vis[maxn-5];void setup(int high){ cnt=0; memset(p,0,sizeof(p)); memset(vis,0,sizeof(vis)); memset(phi,0,sizeof(phi)); phi[1]=1; for (int i=2;i<=high;i++) { if (!vis[i]) { vis[i]=1; p[cnt++]=i; phi[i]=i-1; } for (int j=0;j<cnt && i*p[j]<=high;j++) { vis[i*p[j]]=1; if (i%p[j]) phi[i*p[j]]=phi[i]*(p[j]-1); else { phi[i*p[j]]=phi[i]*p[j]; break; } } } for (int i=1;i<=high;i++) phi[i]+=phi[i-1];}int main(){ scanf("%lld%lld",&n,&m); setup(min(n,m)); LL last=0,t=min(n,m); LL ans=0; for (int i=1;i<=t;i=last+1) { last=min(n/(n/i),m/(m/i)); ans+=(LL) (n/i)*(m/i)*(phi[last]-phi[i-1]); } ans=(LL)ans*2-n*m; printf("%lld\n",ans); return 0;}
0 0
- BZOJ 2005 [Noi2010]能量采集
- BZOJ 2005: [Noi2010]能量采集
- bzoj 2005: [Noi2010] 能量采集
- bzoj 2005: [Noi2010]能量采集
- 能量采集 [Bzoj 2005,Noi2010]
- 【BZOJ】2005 [Noi2010]能量采集
- BZOJ 2005: [Noi2010]能量采集
- 【bzoj 2005】[Noi2010]能量采集
- BZOJ 2005: [Noi2010]能量采集
- BZOJ 2005 [Noi2010]能量采集
- BZOJ[Noi2010]能量采集
- BZOJ系列2005《[Noi2010]能量采集》题解
- bzoj 2005 [Noi2010]能量采集 数学
- BZOJ 2005 [Noi2010]能量采集 (容斥)
- BZOJ 2005([Noi2010]能量采集-数论)
- 2005: [Noi2010]能量采集
- 2005: [Noi2010]能量采集
- BZOJ 2005 NOI2010 能量采集 数论+容斥原理
- 11A - Increasing Sequence
- sed命令
- socket通讯,客户端获取数据丢失问题
- ubuntu10.04 编译安装gcc-5.3.0
- 在android中使用OkHttp框架处理网络请求
- 【BZOJ】2005 [Noi2010]能量采集
- static int 输出
- redis 配置文件
- 推荐大家使用的CSS书写规范、顺序
- 2016 Multi-University Training Contest 1 1002 Chess
- 视差滚动Parallax
- Redis 介绍
- Intent 之系统Intent<一>
- generateParenthesis——leetcode