bzoj3994: [SDOI2015]约数个数和(反演+结论?!)
这题做的历程堪称惊心动魄
刚刚学了莫比乌斯反演的我高高兴兴的和cbx一起反演式子
期间有突破,有停滞,有否定
然后苟蒻的我背着cbx偷偷打开了题解
看到了
我。。。。。。
去你的有个性质啊(当然还是自己知识储备不足)
具体证明
(其实当时主要是想的方向偏了,不然这个定理自己也能想出来)
然后就可以愉快的反演了
Σ(i∈[1,n])Σ(j∈[1.m])d(x,y)
=Σ(i=1)Σ(j=1)Σ(x|i)Σ(y|j)[gcd(x,y)==1]
=Σ(i=1)Σ(j=1)((n/i)*(m/j))Σ(d|i&&d|j)μ(d)
=Σ(d=1)μ(d)Σ(i=1) (n/(d*i)) Σ(j=1)(m/(d*j))
然后我们观察Σ(n/(d*i))
根据性质 (n/(d*i))==((n/d)/i)
我们发现这个东西可以用数论分块O(sqrt(n))预处理,设为f[i]
则原式= Σ(d=1)(μ(d)f[n/d]*f[m/d])
再用数论分块就好了
复杂度O(n*sqrt(n)+T*sqrt(n))
1 #include<iostream>
2 #include<cstdio>
3 #include<cmath>
4 #define ll long long
5 using namespace std;
6 int mu[50100],p[50010],top;ll tot[50100],f[50100];bool v[50010];
7 int main(){
8 f[1]=1;tot[1]=1;
9 for(int i=2;i<=50000;i++){
10 if(!v[i]){
11 p[++top]=i;
12 mu[i]=-1;
13 }
14 for(int j=1;j<=top&&i*p[j]<=50000;j++){
15 if(!(i%p[j])){
16 v[i*p[j]]=1;
17 break;
18 }
19 mu[i*p[j]]=-mu[i];
20 v[i*p[j]]=1;
21 }
22 tot[i]=tot[i-1]+mu[i];
23 int x;
24 for(int j=1;j<=i;j=x+1){
25 x=(i/(i/j));
26 f[i]+=(x-j+1)*(i/j);
27 }
28 }
29 int j,n,m,t;ll ans;
30 scanf("%d",&t);
31 while(t--){
32 scanf("%d%d",&n,&m);
33 if(n>m) swap(n,m);ans=0;
34 for(int i=1;i<=n;i=j+1){
35 j=min((n/(n/i)),(m/(m/i)));
36 ans+=(tot[j]-tot[i-1])*f[n/i]*f[m/i];
37 }
38 printf("%lld\n",ans);
39 }
40 }
第一篇题解博客纪念
bzoj3994: [SDOI2015]约数个数和(反演+结论?!)的更多相关文章
- P3327/bzoj3994 [SDOI2015]约数个数和(莫比乌斯反演)
P3327 [SDOI2015]约数个数和 神犇题解(转) 无话可补 #include<iostream> #include<cstdio> #include<cstri ...
- BZOJ3994: [SDOI2015]约数个数和(莫比乌斯反演)
Description 设d(x)为x的约数个数,给定N.M,求 Input 输入文件包含多组测试数据. 第一行,一个整数T,表示测试数据的组数. 接下来的T行,每行两个整数N.M. Out ...
- BZOJ3994: [SDOI2015]约数个数和
Description 设d(x)为x的约数个数,给定N.M,求 Input 输入文件包含多组测试数据. 第一行,一个整数T,表示测试数据的组数. 接下来的T行,每行两个整数N.M. O ...
- bzoj千题计划203:bzoj3994: [SDOI2015]约数个数和
http://www.lydsy.com/JudgeOnline/problem.php?id=3994 设d(x)为x的约数个数,给定N.M,求 用到的一个结论: 证明: 枚举n的约数i,枚举m的约 ...
- bzoj 3994 [SDOI2015]约数个数和——反演
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3994 \( d(i*j)=\sum\limits_{x|i}\sum\limits_{y|j ...
- [bzoj3994][SDOI2015]约数个数和-数论
Brief Description 计算\(\sum_{i\leqslant n}\sum_{j\leqslant m}\sigma_0(ij)\). Algorithm Design 首先证明一个结 ...
- 【BZOJ3994】[SDOI2015]约数个数和 莫比乌斯反演
[BZOJ3994][SDOI2015]约数个数和 Description 设d(x)为x的约数个数,给定N.M,求 Input 输入文件包含多组测试数据. 第一行,一个整数T,表示测试数据的组 ...
- 【BZOJ3994】约数个数和(莫比乌斯反演)
[BZOJ3994]约数个数和(莫比乌斯反演) 题面 求\[\sum_{i=1}^n\sum_{j=1}^md(ij)\] 多组数据\((<=50000组)\) \(n,m<=50000\ ...
- BZOJ_3994_[SDOI2015]约数个数和_莫比乌斯反演
BZOJ_3994_[SDOI2015]约数个数和_莫比乌斯反演 Description 设d(x)为x的约数个数,给定N.M,求 Input 输入文件包含多组测试数据. 第一行,一个整数T,表 ...
随机推荐
- div+css布局教程系列1
<!doctype html><html><head><meta charset="utf-8"><title>简单布局 ...
- codeforces 688C C. NP-Hard Problem(bfs判断奇数长度环)
题目链接: C. NP-Hard Problem time limit per test 2 seconds memory limit per test 256 megabytes input sta ...
- wpa_supplicant drivers 查看跟踪
/**************************************************************************** * wpa_supplicant drive ...
- 【POJ 2152】 Fire
[题目链接] 点击打开链接 [算法] 同样是树形DP,但是比较难,笔者做这题看了题解 令f[i][j]表示在以i为根的子树中 1.在以i为根的子树中建一些消防站 2.在节点j必须建一个消防站 3.以i ...
- VMware虚拟机安装WinXP出现错误output error file to the following location A:\GHOSTERR.TXT
我们安装Ghost版WinXP系统的时候,可能会出现一个如下图这样的错误:output error file to the following location A:\GHOSTERR.TXT. 出现 ...
- os.path.dirname(__file__)和os.path.abspath(__file__)区别
- hdu4507(数位DP)
题目意思: 给定一个区间,求这段区间中,不含7,对7取余为0,各个位数相加之和对7取余为0的数的平方和. 设d[i][j][k][m]代表长度为i的,对7取余为j的,各个位数相加之和对7取余为k的数的 ...
- hdu 3669(斜率优化DP)
Cross the Wall Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 327680/327680 K (Java/Others) ...
- HDU 3944 DP? (Lucas定理)
题意:在杨辉三角中让你从最上面到 第 n 行,第 m 列所经过的元素之和最小,只能斜向下或者直向下走. 析:很容易知道,如果 m 在n的左半部分,那么就先从 (n, m)向左,再直着向上,如果是在右半 ...
- clipboard.js 实现动态获取内容并复制到剪切板
使用clipboard.js分为以下几个步骤: 1.引入一个clipboard.js的文件: 2.新建一个clipboard对象: 3.点击按钮获取目标对象里面的内容,将其复制到剪切板. 注意:1.目 ...