bzoj 2005 能量采集 莫比乌斯反演
2024-08-24 13:53:26
我们要求的是∑ni=1∑mj=1(2×gcd(i,j)−1)
化简得2×∑ni=1∑mj=1gcd(i,j)−n×m
所以我们现在只需要求出∑ni=1∑mj=1gcd(i,j)即可
∑ni=1∑mj=1gcd(i,j)
=∑ni=1∑mj=1∑d|gcd(i,j)ϕ(d)
=∑min(n,m)d=1ϕ(d)×⌊nd⌋×⌊md⌋
预处理ϕ的前缀和,下底分组即可
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<ctime>
#define N 100500
using namespace std;
int prime[N],tot,n,m;
long long phi[N],ans;
bool bo[N];
void init(){
phi[1]=1;
for(int i=2;i<=n;i++){
if(!bo[i]){
prime[++tot]=i;
phi[i]=i-1;
}
for(int j=1;j<=tot&&i*prime[j]<=n;j++){
bo[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);
}
}
for(int i=1;i<=n;i++)phi[i]+=phi[i-1];
}
int main(){
scanf("%d%d",&n,&m);
if(n>m)swap(n,m);
init();
for(int i=1,j;i<=n;i=j+1){
j=min(n/(n/i),m/(m/i));
ans+=(long long)(phi[j]-phi[i-1])*(n/i)*(m/i);
}
ans*=2; ans-=(long long)n*m;
printf("%lld\n",ans);
return 0;
}
最新文章
- C#SerialPort如何读取串口数据并显示在TextBox上
- 使用css让div半透明
- Runner站立会议03
- easyui 布局自适应
- C# 获取打印机状态
- Specify a culture in string conversion explicitly
- if 和 swith的选择.
- ViewPager引导
- Hot Days Codeforces Round #132 (Div. 2) D(贪婪)
- SQL入门学习5-函数、为此、CASE表达式
- POST请求中参数以form data和request payload形式+清空数组方式
- SqlParameter 使用
- 基于Asp.Net Core Mvc和EntityFramework Core 的实战入门教程系列-3
- xpo-4大类
- android 解析服务器数据使用json还是xml方式
- Android 自定义view --圆形百分比(进度条)
- C语言程序猿必会的内存四区及经典面试题解析
- 编程总结5&;学习总结
- web进修之—Hibernate HQL(7)
- js如何发送wss协议的请求,以及接受服务器返回的数据