【BZOJ2818】Gcd [莫比乌斯反演]
2024-08-31 01:06:33
Gcd
Time Limit: 10 Sec Memory Limit: 256 MB
[Submit][Status][Discuss]
Description
给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的
数对(x,y)有多少对.
Input
一个整数N
Output
如题
Sample Input
4
Sample Output
4
HINT
1<=N<=10^7
Solution
直接莫比乌斯反演即可。
然后对于这个式子,我们下界分块一下即可。
Code
#include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
using namespace std;
typedef long long s64; const int ONE = 1e7+; int T;
int n,m;
bool isp[ONE];
int prime[],p_num;
int miu[ONE],sum_miu[ONE];
s64 Ans; int get()
{
int res=,Q=; char c;
while( (c=getchar())< || c>)
if(c=='-')Q=-;
if(Q) res=c-;
while((c=getchar())>= && c<=)
res=res*+c-;
return res*Q;
} void Getmiu(int MaxN)
{
miu[] = ;
for(int i=; i<=MaxN; i++)
{
if(!isp[i])
isp[i] = , prime[++p_num] = i, miu[i] = -;
for(int j=; j<=p_num, i*prime[j]<=MaxN; j++)
{
isp[i * prime[j]] = ;
if(i % prime[j] == )
{
miu[i * prime[j]] = ;
break;
}
miu[i * prime[j]] = -miu[i];
}
miu[i] += miu[i-];
}
} int main()
{
n=get();
Getmiu(n);
for(int d=; d<=p_num; d++)
{
if(prime[d] > n) break;
int N = n/prime[d];
for(int i=,j=; i<=N; i=j+)
{
j = min(N, N/(N/i));
Ans += (s64)(N/i) * (N/i) * (miu[j] - miu[i-]);
}
} printf("%lld",Ans);
}
最新文章
- 复化梯形求积分——用Python进行数值计算
- Windows Phone 十一、MVVM模式
- Struts2 Action中动态方法调用、通配符的使用
- poj 3522(最小生成树应用)
- 二十、mysql mysqldump备份工具
- hdu 1028
- Cocos2dx 小技巧(十一) 小人虽短,但能够旋转
- Super Hide IP 3.4.7.8允许您以匿名方式进行网上冲浪、 保持隐藏您的 IP 地址
- ExtJs Ext.panel.Panel和Ext.container.Viewport布局问题
- sql server存储过程分页
- IronJs 无相关源?
- [补档][NOI 2008]假面舞会
- BZOJ2726: [SDOI2012]任务安排
- Android WebKit 内核
- Loda Button
- Scrapy的使用
- APACHE - CXF 入门详解
- Django的rest_framework认证组件之全局设置源码解析
- 听说你还不会用Dagger2?Dagger2 For Android最佳实践教程
- 求FIRST集和FOLLOW集