[BZOJ3994][SDOI2015]约数个数和(数论)
来源:互联网 发布:第五代软件下载 编辑:程序博客网 时间:2024/05/21 09:07
=== ===
这里放传送门
=== ===
题解
SDOI怎么净出这样goushi的数论。。让不让人活T_T
题目要求的是
那么我们只需要知道有多少本质不同的
于是我们把这个式子代入上面那个初始公式得到:
然而只有这个式子还是不够,我们需要进一步化简。首先把式子展开然后
可以发现其中
发现后面有一个
首先利用反演公式
注意到
接下来我们要利用下取整函数的一个性质:
对于
代码
#include<cstdio>#include<cstring>#include<algorithm>#define N 50000using namespace std;int mu[50010],prm[50010],f[50010],T,n,m,p1,p2;bool ext[50010];long long ans;void calc_mu(){ mu[1]=1; for (int i=2;i<=N;i++){ if (ext[i]==false){ prm[++prm[0]]=i; mu[i]=-1; } for (int j=1;j<=prm[0];j++){ if (i*prm[j]>N) break; ext[i*prm[j]]=true; if (i%prm[j]==0){ mu[i*prm[j]]=0; break; }else mu[i*prm[j]]=-mu[i]; } mu[i]+=mu[i-1]; }}int calc_f(int n){ int ans=0; for (int i=1,j;i<=n;i=j+1){ j=n/(n/i); if (j>n) j=n; ans+=(n/i)*(j-i+1); } return ans;}int main(){ calc_mu(); for (int i=1;i<=N;i++) f[i]=calc_f(i); scanf("%d",&T); for (int time=1;time<=T;time++){ scanf("%d%d",&n,&m); ans=0;p1=p2=1; if (n>m) swap(n,m); for (int i=1;;){ if (p1<=p2){ ans+=(long long)f[n/i]*f[m/i]*(mu[p1]-mu[i-1]); i=p1+1; }else{ ans+=(long long)f[n/i]*f[m/i]*(mu[p2]-mu[i-1]); i=p2+1; } if (i>n) break; p1=n/(n/i);p2=m/(m/i); } printf("%I64d\n",ans); } return 0;}
偏偏在最后出现的补充说明
常用的经典的化式子方法一定要记熟,做题的时候能一下子想到才行。
其实现在看这个题还是挺简单的一个数论。。用的都是基础公式,化式子的方法也都非常经典。。但是当时不知道为啥瞪着题解看了一天愣是没看懂。。
- [BZOJ3994][SDOI2015]约数个数和(数论)
- 【bzoj3994】【SDOI2015】约数个数和【数论】【反演】
- 【SDOI2015】【BZOJ3994】约数个数和
- [BZOJ3994][SDOI2015]约数个数和
- BZOJ3994: [SDOI2015]约数个数和
- [bzoj3994][SDOI2015]约数个数和
- 【BZOJ3994】【SDOI2015】约数个数和
- 【bzoj3994】[SDOI2015]约数个数和
- bzoj3994: [SDOI2015]约数个数和
- bzoj3994[SDOI2015]约数个数和
- BZOJ3994: [SDOI2015]约数个数和
- bzoj3994 [SDOI2015]约数个数和
- 【bzoj3994】[SDOI2015]约数个数和 线性筛法+莫比乌斯反演+数论分块
- 【bzoj3994】[SDOI2015]约数个数和 莫比乌斯反演
- [BZOJ3994][SDOI2015]约数个数和(莫比乌斯反演)
- 【BZOJ3994】【SDOI2015】约数个数和(莫比乌斯反演)
- [BZOJ3994][SDOI2015]约数个数和(莫比乌斯反演)
- [BZOJ3994][SDOI2015]约数个数和(莫比乌斯反演)
- 求排列的逆序数
- GCD系列:代码块(dispatch_block)
- 手把手教你开发 clang 插件
- J2SE之常用API
- PAT甲级1015. Reversible Primes (20)
- [BZOJ3994][SDOI2015]约数个数和(数论)
- 【第四章】javascript DOM 编程艺术-学习笔记
- 为何Linux广泛应用于服务器
- 三层学习
- 用python 写杨辉三角
- 最大子矩阵和(HD 1559,DP,给定子矩阵行列,O(n^2))
- Ubuntu SVN 搭建
- bzoj2150 部落战争
- 20170206 博客第一天