您的位置:首页 > 其它

【BZOJ】【2005】【NOI2010】能量采集

2015-04-03 17:43 323 查看

欧拉函数

  玛雅,我应该先看看JZP的论文的……贾志鹏《线性筛法与积性函数》例题一

  这题的做法……仔细想下可以得到:$ans=2*\sum_{a=1}^n\sum_{b=1}^m gcd(a,b)-n*m$

  那么重点就在于算$\sum_{a=1}^n\sum_{b=1}^m gcd(a,b)$这个东西

copy一下JZP的推导过程:

$$ \begin{aligned} \sum_{a=1}^n \sum_{b=1}^m gcd(a,b) &= \sum_{a=1}^n \sum_{b=1}^m \sum_{d|gcd(a,b)} \varphi(d) \\ &= \sum_{a=1}^n \sum_{b=1}^m \sum_{d|a and d|b} \varphi(d) \\ &= \sum \varphi(d) \sum_{1 \leq a \leq n \&\& d|a} \sum_{1 \leq b \leq m \&\& d|b} 1 \\ &= \sum \varphi(d) ( \sum_{1 \leq a \leq n \&\& d|a} 1) * ( \sum_{1 \leq b \leq m \&\& d|b} 1) \\ &= \sum \varphi(d) \left\lfloor \frac{n}{d} \right\rfloor \left\lfloor \frac{m}{d} \right\rfloor \end{aligned} $$

/**************************************************************
Problem: 2005
User: Tunix
Language: C++
Result: Accepted
Time:40 ms
Memory:2152 kb
****************************************************************/

//BZOJ 2005
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
using namespace std;
typedef long long LL;
inline int getint(){
int r=1,v=0; char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if(ch=='-')r=-1;
for(; isdigit(ch);ch=getchar()) v=v*10+ch-'0';
return r*v;
}
const int N=1e5+10,INF=~0u>>2;
/*****************template**********************/
int phi
,prime
,tot,n,m;
bool check
;
void getphi(int n){
memset(check,0,sizeof check);
phi[1]=1;
int tot=0;
F(i,2,n){
if(!check[i]){
prime[++tot]=i;
phi[i]=i-1;
}
F(j,1,tot){
if(i*prime[j]>n) break;
check[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]*(prime[j]-1);
}
}
}
int main(){
n=getint(); m=getint();
if (n>m) swap(n,m);
getphi(N-1);
LL ans=0;
F(i,1,n)
ans+=(LL)phi[i]*(n/i)*(m/i);
printf("%lld\n",ans*2-(LL)n*m);
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: