BZOJ2005 [Noi2010]能量采集
2017-02-11 15:56
309 查看
方法一:莫比乌斯反演,裸的O(n),优化之后O(sqrt(n)+sqrt(m))
方法二:容斥
注意ans的统计,是对每个gcd统计
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int maxn=100000+10; int not_prime[maxn],prime[maxn],phi[maxn],sumphi[maxn],pcnt; inline void init_phi() { int n=100000;phi[1]=1; for(int i=2;i<=n;++i) { if(!not_prime[i]) { prime[++pcnt]=i; phi[i]=i-1; } for(int j=1;j<=pcnt&&prime[j]*i<=n;++j) { not_prime[i*prime[j]]=1; if(i%prime[j]==0){ phi[i*prime[j]]=phi[i]*prime[j];break; } else phi[i*prime[j]]=phi[i]*phi[prime[j]]; } } for(int i=1;i<=n;++i) sumphi[i]=sumphi[i-1]+phi[i]; } int main() { init_phi(); int n,m;cin>>n>>m; if(n>m) swap(n,m); unsigned long long ans=0; for(int d=1,j;d<=n;d=j+1) { j=min(n/(n/d),m/(m/d)); ans+=1ll*(n/d)*(m/d)*(sumphi[j]-sumphi[d-1]); } cout<<ans*2-1ll*n*m; return 0; }
方法二:容斥
注意ans的统计,是对每个gcd统计
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; typedef long long ll; const int maxn=100000+10; ll f[maxn];//f[i]表示i为gcd int main() { int n,m;cin>>n>>m; if(n>m) swap(n,m); ll ans=0; for(int i=n;i>=1;--i){ ll cnt=1ll*(n/i)*(m/i); for(int j=i*2;j<=n;j+=i) cnt-=f[j]; f[i]=cnt;ans+=cnt*(i+i-1); } cout<<ans; return 0; }
相关文章推荐
- poj 3254
- DataGridView中将column与数据库表对应的属性
- 【dev Cpp新手请进】dev导入ege图形库
- MySQL数据库MyISAM与InnoDB存储引擎的比较
- MVP+Dagger2+Rxjava+Retrofit+GreenDao 开发的小应用,包含新闻、图片、视频3个大模块,代码封装良好
- mysql数据库服务提示This function has none of DETERMINISTIC的解决方法
- Linux网络预备知识
- android post请求接口demo
- tensorflow的安装教程(基于Ubuntu)
- 美国队长3(内战)
- 【jzoj4264】【tty妹子的函数】
- struts.xml配置问题
- thinkphp-三元运算
- POJ 3713 Transferring Sylla (三连通图)
- VS 2013 with update 5 编译程序出现A task was cancel
- 第二章 Spring MVC入门
- 记录一个breed服务器地址
- 洛谷 1449——后缀表达式(线性数据结构)
- HDU1856:More is better(并查集)
- 图像卷积与滤波的一些知识点