[bzoj3994]约数个数和
来源:互联网 发布:java excel 合并 编辑:程序博客网 时间:2024/05/18 01:16
前排提醒,本文是蒟蒻写的,极大可能性出错,请谨慎食用
好久不写数学题了,随便做一下吧。
题目大意:
给定N,M(<=50000),求:
口胡:
首先我们有一个结论:
那么如何证明呢?
首先我们令
令
做一个二维差分:
于是问题转化为了我们要证明:
我们对于所有素数分类讨论,可以发现一个素数p,假设存在
于是式子得到了证明:
下面就是一个裸的反演啦~
我们令
于是原式可变形为:
那么
线性筛复杂度:
code:
#include<bits/stdc++.h>using namespace std;const int maxn=5e4+10;typedef long long ll;ll prime[maxn],mu[maxn];bool isprime[maxn];ll c[maxn],d[maxn];int cnt;//c[i]表示i的最小因子的次数 inline void get(){ mu[1]=c[1]=d[1]=1; for(int i=2;i<=maxn;i++){ if(!isprime[i]){ prime[++cnt]=i; mu[i]=-1; c[i]=1; d[i]=2; } for(int j=1;j<=cnt&&i*prime[j]<maxn;j++){ isprime[i*prime[j]]=true; if(i%prime[j]==0){ d[i*prime[j]]=d[i]*(c[i]+2)/(c[i]+1); c[i*prime[j]]=c[i]+1; break; } mu[i*prime[j]]=-mu[i]; d[i*prime[j]]=d[i]*d[prime[j]]; c[i*prime[j]]=1; } } for(int i=1;i<maxn;i++) mu[i]+=mu[i-1]; for(int j=1;j<maxn;j++) d[j]+=d[j-1];}inline int read(){ int x=0;char ch=getchar(); while(!isdigit(ch)) ch=getchar(); while(isdigit(ch)) x=x*10+ch-48,ch=getchar(); return x;}int n,m;int main(int argc,const char * argv[]){ get(); int T=read(); while(T--){ n=read();m=read(); if(n>m) swap(n,m); ll ans=0; for(int i=1,nex;i<=n;i=nex+1){ nex=min(n/(n/i),m/(m/i)); ans+=(mu[nex]-mu[i-1])*d[n/i]*d[m/i]; } printf("%lld\n",ans); } return 0;}
阅读全文
0 0
- [bzoj3994]约数个数和
- 【SDOI2015】【BZOJ3994】约数个数和
- [BZOJ3994][SDOI2015]约数个数和
- BZOJ3994: [SDOI2015]约数个数和
- [bzoj3994][SDOI2015]约数个数和
- bzoj3994【SDOI2005】约数个数和
- 【BZOJ3994】【SDOI2015】约数个数和
- 【bzoj3994】[SDOI2015]约数个数和
- bzoj3994: [SDOI2015]约数个数和
- bzoj3994[SDOI2015]约数个数和
- BZOJ3994: [SDOI2015]约数个数和
- bzoj3994 [SDOI2015]约数个数和
- 【bzoj3994】【SDOI2015】约数个数和【数论】【反演】
- [BZOJ3994][SDOI2015]约数个数和(数论)
- 【莫比乌斯反演】[BZOJ3994]约数个数和
- bzoj3994 约数个数和 数论&莫比乌斯反演
- 【bzoj3994】[SDOI2015]约数个数和 莫比乌斯反演
- 约数个数和(数论,莫比乌斯反演)BZOJ3994
- 1047. Student List for Course (25)
- 《数据结构(C语言版)》- 队列
- sql语句
- 文件权限篇(二)
- WIFI 考勤打卡 浅析
- [bzoj3994]约数个数和
- gridview xian
- 判断大小端模式与共用体
- golang json解析出现值为空
- CodeVS 1063 合并果子 题解
- 机器学习中对假设的评价
- 清北学堂夏令营有感
- Linux 配置虚拟IP地址
- 为什么构造函数不能声明为虚函数?