【莫比乌斯反演】BZOJ2154Crash的数字表格&BZOJ2693jzptab
来源:互联网 发布:装潢设计效果图软件 编辑:程序博客网 时间:2024/06/07 01:14
首先是BZOJ2154
题目大意
给出n,m求
满足
分析
因为比起lcm,我们更常用到gcd,因此首先将题目转换为求gcd的形式
接下来,一扯到gcd,本能驱使我们这么设(说白了就是做多了的经验)
接下来才开始推(以上基本没什么营养)
推到这里,不难想到求出f函数,再分块求和,求和方法类似bzoj2301problem b
接下来的问题就是求出f
所以
这就是典型的可以做莫比乌斯反演的形式,那么。。反演呗
因为我们要求的k=1,所以
因此再用老方法,分块,
因此总复杂度为
#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<vector>#define SF scanf#define PF printf#define MAXN 10000010int MAXPRIME;#define MOD 20101009using namespace std;vector<long long> primes;int isprime[MAXN],mu[MAXN];long long sum[MAXN],n,m;void prepare(){ mu[1]=1; for(long long i=2;i<=MAXPRIME;i++){ if(isprime[i]==0){ mu[i]=-1; primes.push_back(i); } for(int j=0;j<primes.size()&&i*primes[j]<=MAXPRIME;j++){ isprime[i*primes[j]]=1; if(i%primes[j]==0){ mu[i*primes[j]]=0; break; } mu[i*primes[j]]=-mu[i]; } } for(long long i=1;i<=MAXPRIME;i++) sum[i]=(1ll*mu[i]*i*i+sum[i-1]+MOD)%MOD;}long long que(long long x,long long y){ long long res=0,last; for(long long i=1;i<=min(x,y);i=last+1){ last=min(x/(x/i),y/(y/i)); res=(res+((sum[last]-sum[i-1])%MOD*((x/i)*((x/i)+1)/2%MOD*((y/i)*((y/i)+1)/2%MOD)%MOD))%MOD+MOD)%MOD; res%=MOD; } return res;}int main(){ //freopen("data.in","r",stdin); //freopen("data.out","w",stdout); SF("%lld%lld",&n,&m); MAXPRIME=min(n,m); prepare(); long long ans=0,last; for(long long i=1;i<=min(n,m);i=last+1){ last=min(n/(n/i),m/(m/i)); ans=(ans+(i+last)*(last-i+1)/2%MOD*que(n/i,m/i))%MOD; //PF("%I64d\n",ans); } PF("%lld",ans);}
以下为BZOJ2693jzptap的内容
题目大意
与上题完全相同,但改为多组数据,最多10000组
分析
10000组数据,明显上题O(n)的复杂度是不可能的了
因此考虑优化,为了方便起见,将答案的转移试整理一下。
BZOJ2820的经验告诉我们,当有多个枚举量,且这多个枚举量多以乘积的形式出现在公式中,一种比较常用的优化方式,就是枚举这几个枚举量的乘积,即:
因此,只要预处理出S函数的的前缀和,那么就可以在O(
接下来就要用到一直以来从未用过的积性函数的特征。
因为积性函数的因子和倍数都是积性函数,所以这个函数必定为积性函数。那么就可以用线性筛的方式快速求出函数。
线性筛的特征是:任何一个数都被它最小的质因子筛到,因此我们可以利用这一点求值(类似于筛莫比乌斯函数)设一个数
至此,本题就可以解决了。
说说一些题外话,相比上题,本题我的代码不多出15行,更重要的是还是1A,但上题我却因为取模的问题WA了近十次…
#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<vector>#define SF scanf#define PF printf#define MAXN 10000010#define MAXPRIME 10000000#define MOD 100000009using namespace std;int mu[MAXN],isprime[MAXN];vector<int> primes;long long sum[MAXN];void prepare(){ mu[1]=1; sum[1]=1; for(long long i=2;i<=MAXPRIME;i++){ if(isprime[i]==0){ primes.push_back(i); mu[i]=-1; sum[i]=-i*i+i; } sum[i]%=MOD; //PF("(%I64d)\n",sum[i]); for(int j=0;j<primes.size()&&i*primes[j]<=MAXPRIME;j++){ isprime[primes[j]*i]=1; if(i%primes[j]==0){ sum[i*primes[j]]=(primes[j]*sum[i])%MOD; break; } mu[i*primes[j]]=-mu[i]; sum[i*primes[j]]=(sum[i]*sum[primes[j]])%MOD; } } for(int i=1;i<=MAXPRIME;i++){ sum[i]+=sum[i-1]; sum[i]%=MOD; }}int t;long long n,m;long long s(long long x){ return ((x*(x+1))/2)%MOD;}int main(){ prepare(); SF("%d",&t); while(t--){ SF("%I64d%I64d",&n,&m); long long last=0,res=0; for(long long i=1;i<=min(n,m);i=last+1){ last=min(n/(n/i),m/(m/i)); res+=((s(n/i)*s(m/i))%MOD*(sum[last]-sum[i-1]+MOD+MOD))%MOD; //PF("(%lld %lld)",last,res); res%=MOD; } PF("%lld\n",res); }}
阅读全文
3 0
- 【莫比乌斯反演】BZOJ2154Crash的数字表格&BZOJ2693jzptab
- bzoj2693jzptab莫比乌斯反演
- [BZOJ2154]Crash的数字表格 && 莫比乌斯反演
- 【莫比乌斯反演】[BZOJ2154]Crash的数字表格
- 【bzoj2154】【Crash的数字表格】【莫比乌斯反演】
- bzoj2154 Crash的数字表格(莫比乌斯反演)
- bzoj 4816: [Sdoi2017]数字表格 莫比乌斯反演
- [莫比乌斯反演] BZOJ 4816 [Sdoi2017]数字表格
- [莫比乌斯反演] BZOJ4816: [Sdoi2017]数字表格
- [数论][莫比乌斯反演] BZOJ 4816: 数字表格
- [BZOJ4816][SDOI2017]数字表格(莫比乌斯反演)
- bzoj2154: Crash的数字表格/2693: jzptab [莫比乌斯反演、数论推导]
- 【BZOJ】【P2154】【Crash的数字表格】【题解】【莫比乌斯反演】
- BZOJ 2154 Crash的数字表格 莫比乌斯反演
- 【bzoj2154/2693】Crash的数字表格/jzptab 莫比乌斯反演
- 【莫比乌斯反演】[HYSBZ\BZOJ2154]Crash的数字表格
- HYSBZ/BZOJ 2154 Crash的数字表格 - 莫比乌斯反演
- 2693: jzptab/2154: Crash的数字表格 莫比乌斯反演
- 【排序算法】希尔排序
- 关于 SetProcessWorkingSetSize 的那点事儿
- 变化总是那么大
- 20170711
- Python函数-int()
- 【莫比乌斯反演】BZOJ2154Crash的数字表格&BZOJ2693jzptab
- Python中的正则表达式探秘1
- 棋牌开发需要注意哪些事项
- android开发:activity继承AppCompatActivity 去掉标题栏
- .net数组集合字符串
- linux常用指令
- 【Android】- MediaPlayer错误之MediaPlayer start called in state 0
- 使用JS让网站自动跳转到对应的WAP页面
- html表单设计