BZOJ 3309 DZY Loves Math ——莫比乌斯反演
2024-09-07 23:48:17
枚举$d=gcd(i,j)$
然后大力反演
——来自Popoqqq的博客。
然后大力讨论后面的函数的意义即可。
http://blog.csdn.net/popoqqq/article/details/42122413
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)
#define ll long long
#define maxn 10000005
#define inf 0x3f3f3f3f int g[maxn],pr[maxn],top,a[maxn],b[maxn];
bool vis[maxn]; void init()
{
memset(vis,false,sizeof vis);
F(i,2,maxn-1)
{
if (!vis[i])
{
pr[++top]=i;
g[i]=1;
a[i]=1;
b[i]=i;
}
F(j,1,top)
{
if ((ll)i*pr[j]>=maxn) break;
vis[i*pr[j]]=true;
if (i%pr[j]==0)
{
a[i*pr[j]]=a[i]+1;
b[i*pr[j]]=b[i]*pr[j];
int tmp=i/b[i];
if (tmp==1) g[i*pr[j]]=1;
else g[i*pr[j]]=(a[tmp]==a[i*pr[j]])?-g[tmp]:0;
break;
}
a[i*pr[j]]=1;
b[i*pr[j]]=pr[j];
g[i*pr[j]]=(a[i]==1?-g[i]:0);
}
}
F(i,2,maxn-1) g[i]=g[i-1]+g[i];
} int t,n,m; int main()
{
init();
scanf("%d",&t);
while (t--)
{
scanf("%d%d",&n,&m);ll ans=0;
if (n>m) n^=m^=n^=m;
for (int i=1,last=0;i<=n;i=last+1)
{
last=min(n/(n/i),m/(m/i));
ans+=((ll)g[last]-g[i-1])*(n/i)*(m/i);
}
printf("%lld\n",ans);
}
}
最新文章
- mysql errno 150
- linux网络配置
- C++引用笔记
- C++的CreateThread实例
- Xcode中,调试console窗口输出error: Couldn&#39;t materialize struct: the variable &#39;cell&#39; has no location, it may have been optimized out的问题
- 查找并绘制轮廓[OpenCV 笔记XX]
- oracle操作字符串:拼接、替换、截取、查找
- ural 1090 In the Army Now
- 【转】Jmeter(二)-使用代理录制脚本
- Jquery 组 tbale表格隔行变色
- hive表增量抽取到mysql(关系数据库)的通用程序(三)
- poj2728 Desert King【最优比率生成树】【Prim】【0/1分数规划】
- 20155202张旭 Exp5 MSF基础应用
- Cap+Exceptionless实现日志消息发布订阅异常情况日志处理及Cap DashBoard授权处理
- c++中 extern
- android自定义风格的toast
- Could not read symbols解决方法
- 关于sdl_ttf使用字体库加载失败的问题
- 后序线索二叉树中查找结点*p的后继
- 深入了解java虚拟机(JVM) 第七章 内存分配策略