洛谷 P3327 [SDOI2015]约数个数和 || Number Challenge Codeforces - 235E
https://www.luogu.org/problemnew/show/P3327
不会做。
去搜题解...为什么题解都用了一个奇怪的公式?太奇怪了啊。。。
公式是这样的:
$d(xy)=\sum_{i|x}\sum_{j|y}[(i,j)=1]$
证明:(转自:https://23613.blog.luogu.org/solution-p3327)
考虑一个质因子p,设x中p的指数为a,y中p的指数为b(指质因数分解结果中指数),那么根据因数个数定理,这个质因子对式子左边的贡献(指使得答案乘上的值)是a+b+1;在式子右边,要么i中p的指数为0且j中p的指数为1~b,要么j中p的指数为0且i中p的指数为1~a,要么i和j中p的指数均为0(为了保证i,j互质),所以p的贡献是(b+a+1)。那么左右两边就相等了...
没办法了,背公式吧...找不到别的做法
答案要求的式子ans可以化为$\sum_{i=1}^n\sum_{j=1}^m[(i,j)=1]{\lfloor}\frac{n}{i}{\rfloor}{\lfloor}\frac{m}{j}{\rfloor}$
反演一下,得到$ans=\sum_{k=1}^m\mu(k)\sum_{i=1}^{{\lfloor}\frac{n}{k}{\rfloor}}\sum_{j=1}^{{\lfloor}\frac{m}{k}{\rfloor}}{\lfloor}\frac{n}{ik}{\rfloor}{\lfloor}\frac{m}{jk}{\rfloor}$(不妨设n<=m)
设$f(x)=\sum_{i=1}^x{\lfloor}\frac{x}{i}{\rfloor}$,这个显然可以n*sqrt预处理出来
$ans=\sum_{k=1}^m\mu(k)f({\lfloor}\frac{n}{k}{\rfloor})f({\lfloor}\frac{m}{k}{\rfloor})$
那么原式也可以简单的在一次询问sqrt的时间内求出
本以为就这样子A掉了,结果...T飞了
不管了。。O3开开A掉
网上找了一下,有一个方法卡常数:可以发现f函数是约数个数函数的前缀和,因此可以筛出约数个数然后直接前缀和,这样预处理就是O(n)的
#pragma GCC optimize(3)
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
ll prime[],len,ff[],mu[];
bool nprime[];
ll ans,n,m;
int main()
{
ll i,j,k,T;
mu[]=;
for(i=;i<=;i++)
{
if(!nprime[i]) prime[++len]=i,mu[i]=-;
for(j=;j<=len&&i*prime[j]<=;j++)
{
nprime[i*prime[j]]=;
if(i%prime[j]==) {mu[i*prime[j]]=;break;}
else mu[i*prime[j]]=-mu[i];
}
}
for(i=;i<=;i++) mu[i]+=mu[i-];
for(k=;k<=;k++)
{
for(i=;i<=k;i=j+)
{
j=min(k,k/(k/i));
ff[k]+=(j-i+)*(k/i);
}
}
//for(i=1;i<=10;i++) printf("%lld\n",ff[i]);
scanf("%lld",&T);
while(T--)
{
scanf("%lld%lld",&n,&m);
if(n>m) swap(n,m);
ans=;
for(i=;i<=n;i=j+)
{
j=min(n,min(n/(n/i),m/(m/i)));
ans+=(mu[j]-mu[i-])*ff[n/i]*ff[m/i];
}
printf("%lld\n",ans);
}
return ;
}
http://codeforces.com/contest/235/problem/E
是不是感觉非常像?
事实上,不仅式子像,结论也是一样的。。。好神奇啊
结论是:$d(xyz)=\sum_{i|x}\sum_{j|y}\sum_{k|z}[(i,j)=1][(j,k)=1][(i,k)=1]$
证明也是类似的;貌似可以推广到更高维(?没试过)
同样的,$ans=\sum_{i=1}^a\sum_{j=1}^b\sum_{k=1}^c[(i,j)=1][(j,k)=1][(i,k)=1]{\lfloor}\frac{a}{i}{\rfloor}{\lfloor}\frac{b}{j}{\rfloor}{\lfloor}\frac{c}{k}{\rfloor}$
耶,我又不会了,反演嘛式子推不清楚,乱搞嘛搞不出来
到网上找,发现一个技巧:如果只是要求XXX=1,用$\sum_{d|k}\mu(d)=[k=1]$去代比直接反演更方便
有了这样一个做法:
枚举i,搞出所有可能的j,k(指与i互质且在范围内),分别放入数组aj,ak
那么就需要从aj,ak内分别取一个元素x,y,如果(x,y)==1则可以计算贡献
也就是要计算$\sum_{j{\in}aj}\sum_{k{\in}ak}[(j,k)=1]{\lfloor}\frac{b}{j}{\rfloor}{\lfloor}\frac{c}{k}{\rfloor}=\sum_{j{\in}aj}\sum_{k{\in}ak}\sum_{d|(j,k)}\mu(d){\lfloor}\frac{b}{j}{\rfloor}{\lfloor}\frac{c}{k}{\rfloor}$
考虑对每一个d统计贡献,复杂度n^2*log
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
int prime[],len,mu[];
bool nprime[];
int a,b,c,mm;
unsigned ans,a1,n1,n2;
bool aj[],ak[];
int main()
{
int i,j,k,d;
mu[]=;
for(i=;i<=;i++)
{
if(!nprime[i]) prime[++len]=i,mu[i]=-;
for(j=;j<=len&&i*prime[j]<=;j++)
{
nprime[i*prime[j]]=;
if(i%prime[j]==) {mu[i*prime[j]]=;break;}
else mu[i*prime[j]]=-mu[i];
}
}
scanf("%d%d%d",&a,&b,&c);
mm=max({a,b,c});
for(i=;i<=a;i++)
{
a1=;
for(j=;j<=b;j++)
aj[j]=(__gcd(i,j)==);
for(k=;k<=c;k++)
ak[k]=(__gcd(i,k)==);
for(d=;d<=mm;d++)
{
n1=n2=;
for(j=d;j<=b;j+=d)
n1+=aj[j]*(b/j);
for(k=d;k<=c;k+=d)
n2+=ak[k]*(c/k);
a1+=n1*n2*mu[d];
}
ans+=a1*(a/i);
}
printf("%u",ans%);
return ;
}
洛谷 P3327 [SDOI2015]约数个数和 || Number Challenge Codeforces - 235E的更多相关文章
- 洛谷P3327 - [SDOI2015]约数个数和
Portal Description 共\(T(T\leq5\times10^4)\)组数据.给出\(n,m(n,m\leq5\times10^4)\),求\[\sum_{i=1}^n\sum_{j= ...
- 洛谷P3327 [SDOI2015]约数个数和 【莫比乌斯反演】
题目 设d(x)为x的约数个数,给定N.M,求\(\sum_{i = 1}^{N} \sum_{j = 1}^{M} d(ij)\) 输入格式 输入文件包含多组测试数据.第一行,一个整数T,表示测试数 ...
- 洛谷P3327 [SDOI2015]约数个数和(莫比乌斯反演)
题目描述 设d(x)为x的约数个数,给定N.M,求 \sum^N_{i=1}\sum^M_{j=1}d(ij)∑i=1N∑j=1Md(ij) 输入输出格式 输入格式: 输入文件包含多组测试数据.第 ...
- 洛谷P3327 [SDOI2015]约数个数和(莫比乌斯反演)
传送门 公式太长了……我就直接抄一下这位大佬好了……实在懒得打了 首先据说$d(ij)$有个性质$$d(ij)=\sum_{x|i}\sum_{y|j}[gcd(x,y)=1]$$ 我们所求的答案为$ ...
- LOJ #2185 / 洛谷 P3329 - [SDOI2015]约数个数和(莫比乌斯函数)
LOJ 题面传送门 / 洛谷题面传送门 题意: 求 \(\sum\limits_{i=1}^n\sum\limits_{j=1}^md(ij)\),\(d(x)\) 为 \(x\) 的约数个数. \( ...
- P3327 [SDOI2015]约数个数和 莫比乌斯反演
P3327 [SDOI2015]约数个数和 莫比乌斯反演 链接 luogu 思路 第一个式子我也不会,luogu有个证明,自己感悟吧. \[d(ij)=\sum\limits_{x|i}\sum\li ...
- Luogu P3327 [SDOI2015]约数个数和
又是恶心的莫比乌斯反演,蒟蒻我又是一脸懵逼的被CXR dalao狂虐. 题目要求\(ans=\sum_{i=1}^n \sum_{j=1}^m d(ij)\),其中\(d(ij)\)表示数\(x\)的 ...
- 并不对劲的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)$ 题解 假设\( ...
- luogu P3327 [SDOI2015]约数个数和 莫比乌斯反演
题面 我的做法基于以下两个公式: \[[n=1]=\sum_{d|n}\mu(d)\] \[\sigma_0(i*j)=\sum_{x|i}\sum_{y|j}[gcd(x,y)=1]\] 其中\(\ ...
随机推荐
- angularjs学习之八(angularjs中isolate scope的使用)
angular js中指令directive有个特别实用的东西,那就是 isolate scope (被隔离的scope) 关于详细他和全局的scope 有什么差别.能够參考以下这篇博文: Angul ...
- WPF DataGrid获取选择行的数据
在WPF中,单击DataGrid,如何获取当前点击的行? 比如在MouseDoubleClick事件中,事实上获取的选中行是一个DataRowview,你可以通过以下的方法来获取选中行的数据,需要引用 ...
- node封装mysql模块
node是基于异步的,因此在进行数据库查询操作的通常是通过回调来操作查询结果.但是在有了es7的async/await,基本不再需要回调了,所以本篇是基于async/await对mysql进行一次操作 ...
- POJ 3279 Dungeon Master
Dungeon Master Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 21242 Accepted: 8265 D ...
- RK3399参考设计方案之DC-DC电源芯片RK808D【转】
本文转载自:http://www.52rd.com/Blog/Detail_RD.Blog_sunnyqi_90673.html?WebShieldDRSessionVerify=Xv0bsGtD73 ...
- UVA11613 Acme Corporation —— 最小费用流(流量不固定的最小费用流)
题目链接:https://vjudge.net/problem/UVA-11613 题意: 商品X在第i个月内:生产一件需要花费mi元,最多可生产ni件,销售一件(在这个月内销售,而不管它是在那个月生 ...
- 51Nod 1089 最长回文子串 V2 —— Manacher算法
题目链接:https://vjudge.net/problem/51Nod-1089 1089 最长回文子串 V2(Manacher算法) 基准时间限制:1 秒 空间限制:131072 KB 分值: ...
- SILVERLIGHT实现对HTML DOM的访问
实现对HTML DOM的访问.Silverlight 2在命名空间System.Windows.Browser下内置了很多对于HTML DOM访问和操作的支持,我们最常用的一个对象是HtmlEleme ...
- oracle:block 的 water mark问题
看了小布老师关于block里面数据存储的high water mark的实验,自己也做了一遍. SQL> create table x(i int,name varchar(20)); Tabl ...
- 分享windows自带计划任务Task schedule使用指南
下面以“启动运行QQ程序,无限期每186秒一次”为例,演示如何使用计划任务功能. 今天IT外包 www.itwaibaow.com 就为大家分享如何使用win7"计划任务“(Task sch ...