并不对劲的bzoj3994:loj2185:p3327[SDOI2015]约数个数和
题目大意
设d(x)为x的约数个数,\(t\)组询问,给定\(n,m\)(\(t,m,n\leq5*10^4\)),求$ \sum^n_{i=1}\sum^m_{j=1}d(i*j)$
题解
假设\(n\leq m\)
设\(i=p_1^{a_1}*p_2^{a_2}*...*p_k^{a_k},j=p_1^{b_1}*p_2^{b_2}*...*p_k^{b_k}\)
对于\(i*j\)的某个约数\(x\),设\(x=p_1^{c_1}*p_2^{c_2}*...*p_k^{c_k}\),那么可以用两个数\(e,f\)表示\(x\),当\(c_q\leq a_q\)时\(e\)的\(p_q\)的指数为\(c_q\),当\(c_q> a_q\)时\(f\)的\(p_q\)的指数为\(c_q-a_q\)
这样每个\(x\)都能对应到一对\((e,f)\)上,每对满足\(e|i,f|j,gcd(e,f)=1\)的\((e,f)\)也能对应到一个\(x\)上
所以就有\(d(i,j)=\sum_{e|i}\sum_{f|j}[gcd(e,f)=1]\)
原式=$ \sum^n_{i=1}\sum^m_{j=1}\sum_{e|i}\sum_{f|j}[gcd(e,f)=1]$
把枚举\(e,f\)放到前面,得原式=\(\sum_{e=1}^{n}\sum_{f=1}^{m}\lfloor\frac{n}{e}\rfloor\lfloor\frac{m}{f}\rfloor[gcd(e,f)=1]\)
=\(\sum_{e=1}^{n}\sum_{f=1}^{m}\lfloor\frac{n}{e}\rfloor\lfloor\frac{m}{f}\rfloor\sum_{i|e,i|f}\mu(i)\)
=\(\sum_{i=1}^{n}\mu(i)\sum_{i|e}^{n}{\lfloor\frac{n}{e}\rfloor}\sum_{i|f}^{m}{\lfloor\frac{m}{f}\rfloor}\)
=\(\sum_{i=1}^{n}\mu(i)\sum_{e=1}^{\lfloor\frac{n}{i}\rfloor}{\lfloor\frac{n}{e*i}\rfloor}\sum_{f=1}^{\lfloor\frac{m}{i}\rfloor}{\lfloor\frac{m}{f*i}\rfloor}\)
设\(g(x)=\sum_{i=1}^{x}{\lfloor\frac{x}{i}\rfloor}\),预处理\(g(x)\)
则原式=\(\sum_{i=1}^{n}{\mu(i)*g(n/i)*g(m/i)}\)
接下来整除分块就行了
代码
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<iomanip>
#include<iostream>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#define rep(i,x,y) for(register int i=(x);i<=(y);++i)
#define dwn(i,x,y) for(register int i=(x);i>=(y);--i)
#define maxn 50010
#define lim 50000
#define LL long long
using namespace std;
int read()
{int x=0,f=1;char ch=getchar();while(!isdigit(ch)&&ch!='-')ch=getchar();if(ch=='-')f=-1,ch=getchar();while(isdigit(ch))x=(x<<1)+(x<<3)+ch-'0',ch=getchar();return x*f;
}
void write(LL x)
{if(x==0){putchar('0'),putchar('\n');return;}int f=0;char ch[20];if(x<0)putchar('-'),x=-x;while(x)ch[++f]=x%10+'0',x/=10;while(f)putchar(ch[f--]);putchar('\n');return;
}
int n,m,t,p[maxn],no[maxn],cnt;
LL f[maxn],g[maxn],mu[maxn];
int main()
{//freopen(".in","r",stdin);//freopen(".out","w",stdout);mu[1]=p[1]=no[1]=1;rep(i,2,lim){if(!no[i])p[++cnt]=i,mu[i]=-1;for(int j=1;j<=cnt&&i*p[j]<=lim;j++){no[i*p[j]]=1;if(i%p[j]==0){mu[i*p[j]]=0;break;}else mu[i*p[j]]=-mu[i];}}rep(i,1,lim)mu[i]+=mu[i-1];rep(i,1,lim){for(int l=1,r=0;l<=i;l=r+1){r=i/(i/l);f[i]+=(LL)(i/l)*(LL)(r-l+1);}}t=read();while(t--){n=read(),m=read();LL ans=0;if(n>m)swap(n,m);for(int l=1,r=0;l<=n;l=r+1){r=min(n/(n/l),m/(m/l));ans+=(mu[r]-mu[l-1])*f[n/l]*f[m/l];}write(ans);}return 0;
}
转载于:https://www.cnblogs.com/xzyf/p/10444842.html
并不对劲的bzoj3994:loj2185:p3327[SDOI2015]约数个数和相关推荐
- P3327 [SDOI2015]约数个数和 (mobius反演)
P3327 [SDOI2015]约数个数和 推导过程 求∑i=1n∑j=1md(ij)\sum_{i = 1} ^{n} \sum_{j = 1} ^{m} d(ij)∑i=1n∑j=1md(ij ...
- P3327 [SDOI2015]约数个数和
P3327 [SDOI2015]约数个数和 题意: 设 d(x) 为 x 的约数个数,给定 n,m,求 ∑i=1n∑j=1md(i,j)\sum_{i=1}^{n}\sum_{j=1}^{m}d(i, ...
- luogu P3327 [SDOI2015]约数个数和(rng58-clj等式)
luogu P3327 [SDOI2015]约数个数和(rng58-clj等式) 题目大意 设d(x)d(x)d(x)为x的因子的个数,给出N和M求 ∑i=1n∑j=1md(i,j)\sum_{i=1 ...
- 【BZOJ3994】[SDOI2015]约数个数和 莫比乌斯反演
[BZOJ3994][SDOI2015]约数个数和 Description 设d(x)为x的约数个数,给定N.M,求 Input 输入文件包含多组测试数据. 第一行,一个整数T,表示测试数据的组数 ...
- [BZOJ3994][SDOI2015]约数个数和
3994: [SDOI2015]约数个数和 Time Limit: 20 Sec Memory Limit: 128 MB Submit: 1104 Solved: 762 [Submit][St ...
- [SDOI2015]约数个数和【莫比乌斯反演】
[SDOI2015]约数个数和 题意:\(d(x)\)为\(x\)的约数个数,求\(\sum_{i=1}^n\sum{j=1}^md(ij)\) 由结论得\[ans=\sum_{i=1}^n\sum_ ...
- 洛谷 [SDOI2015]约数个数和 解题报告
[SDOI2015]约数个数和 题目描述 设\(d(x)\)为\(x\)的约数个数,给定\(N,M\),求$ \sum\limits^N_{i=1}\sum\limits^M_{j=1}d(ij)$ ...
- 【bzoj3994】[SDOI2015]约数个数和 莫比乌斯反演
题目描述 设d(x)为x的约数个数,给定N.M,求 输入 输入文件包含多组测试数据. 第一行,一个整数T,表示测试数据的组数. 接下来的T行,每行两个整数N.M. 输出 T行,每行一个整数,表示你 ...
- [bzoj3994] [SDOI2015]约数个数和
Description 设d(x)为x的约数个数,给定N.M,求 \(\sum_{i=1}^N\sum_{j=1}^Md(ij)\) Input 输入文件包含多组测试数据. 第一行,一个整数T,表示测 ...
最新文章
- 网页开发 与数据联动的图_零基础学习数据可视化pyecharts人物关系图开发
- 对话百度贾磊/喻友平:深度学习正往跨领域融合高速发展
- 不知所“云”:小企业对云托管知之甚少
- java try catch 捕捉异常_java的 try-catch异常捕捉处理
- 网站外链优化布局和新增技巧介绍!
- python中的散点图代码-python – 带有图例的matplotlib散点图
- SharePoint 部署解决方案Feature ID冲突
- 信息学奥赛一本通(C++)在线评测系统——基础(三)数据结构 —— 1363:小球(drop)
- 【Linux】一步一步学Linux——usermod命令(86)
- python爬取糗事百科
- SAP Spartacus路由参数的默认配置
- 二分算法:平均值(洛谷 UVA1451)
- JVM调优总结(1):一些概念
- python亲密度_Python OpenCV 图像2D直方图,取经之旅第 25 天
- dz论坛php.ini设置,Discuz!X1.5至3.2论坛Win主机与Linux主机伪静态设置方法
- android item三种,Android RecyclerView中的ItemDecoration的几种绘制方法
- element-ui select单选切换多选问题解决
- Yearn已部署新YFI策略Brownie Mix
- 终于!孙宇晨和巴菲特吃上 3153 万元的晚餐,还送了一个比特币!
- php tp5 parent,[李景山php]每天TP5-20161225|thinkphp5-Console.php-2