hdu 1695: GCD 【莫比乌斯反演】
2024-09-06 00:41:34
这题求[1,n],[1,m]gcd为k的对数。而且没有顺序。
设F(n)为公约数为n的组数个数
f(n)为最大公约数为n的组数个数
然后在纸上手动验一下F(n)和f(n)的关系,直接套公式就好了。注意要删去重复的。
关于 莫比乌斯反演 的结论
ACdreamers大神的相关博客 莫比乌斯反演 莫比乌斯反演与最大公约数
#include<bits/stdc++.h>
using namespace std;
typedef long long LL; const int maxn=1e6; int prime[maxn+];
bool check[maxn+];
int mu[maxn+]; void init()
{
mu[]=;
int tot=;
for(int i=;i<=maxn;i++)
{
if(!check[i])
{
prime[tot++]=i;
mu[i]=-;
}
for(int j=;j<tot;j++)
{
if(i*prime[j]>maxn) break;
check[i*prime[j]]=true;
if(i%prime[j]==)
{
mu[i*prime[j]]=;
break;
}
else
{
mu[i*prime[j]]=-mu[i];
}
}
}
} int main()
{
int T;
int a,b,c,d,k;
init();
scanf("%d",&T);
for(int kase=;kase<=T;kase++)
{
scanf("%d%d%d%d%d",&a,&b,&c,&d,&k);
if(k==)
{
printf("Case %d: 0\n",kase);
continue;
}
b/=k;
d/=k;
if(b>d) swap(b,d);
LL ans=;
for(int i=;i<=b;i++)
ans+=(LL)mu[i]*(b/i)*(d/i);
LL t=;
for(int i=;i<=b;i++)
t+=(LL)mu[i]*(b/i)*(b/i);
ans-=t/;
printf("Case %d: %I64d\n",kase,ans);
}
}
最新文章
- 委托、Lambda表达式和事件
- Hibernate
- MFC 给对话框注册热键
- jquery学习笔记:获取下拉框的值和下拉框的txt
- 英語版Windows Server 2012 R2を日本語化する手順
- python之json
- ID(dfs+bfs)-hdu-4127-Flood-it!
- 在MySQL中创建实现自增的序列(Sequence)的教程
- Qt实战之开发软件数据获取助手(eventFilter处理鼠标按下,event处理鼠标松开)
- PHP中对mysql预编译查询语句的一个封装
- html5中cookie介绍,封装以及添加,获取,删除
- 关于Python 解包,你需要知道的一切
- 微信小程序支付,带java源码
- selenium chromedriver geckodriver iedriverserver下载
- Nginx 优化缓冲区与传输效率
- 流控制、FlowControl
- Linux md5sum 的用法
- java_分解质因数
- CocosCreator原生平台退出游戏,暂停和继续
- [转]ajQuery的deferred对象详解