Troywar love Maths——莫比乌斯反演
Posted Troy Ricardo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Troywar love Maths——莫比乌斯反演相关的知识,希望对你有一定的参考价值。
2816. Troywar loves Maths
★★☆ 输入文件:Troy_1.in
输出文件:Troy_1.out
简单对比
时间限制:1 s 内存限制:256 MB
【题目描述】
众所周知,Troywar总是不好好上课看数(xiao)论(shuo)。一天数学老师是在看不下去了,于是决定考(jiao)考(xun)他一下。于是,扔给了Troywar一个问题:给定两个正整数n和m,有多少对1<=i<=n,1<=j<=m使得$a=2^{i}+1,b=2^{j}+1$满足a和b的最大公约数为3。翘课的Troywar当然不会了,他只好求助你。
【输入格式】
两个正整数n,m
【输出格式】
一个整数。
【样例输入】
10 10
【样例输出】
19
【数据范围】
1.10% n,m<=63
2.另有20%数据保证n,m<=1000
3.另有20%数据保证n<=3
4.对于所有数据,保证n,m<=1e7
【来源】
题解:
第一次出题,也不知道有没有人做……我们先把n调成n,m中小的,m为较大的。
$\\sum_{i=1}^{n}\\sum_{j=1}^{m}[\\gcd(2^{i}+1,2^{j}+1)==3]$
$首先,我们的要求是3|2^{x}+1$
$2^x+1\\equiv 2^{x\\,\\bmod \\phi(3)}+1(\\bmod)3$
$所以当x为奇数时才可能成立,先令i>j$
$\\;\\;\\;\\;\\gcd(2^{i}+1,2^{j}+1)=\\gcd(2^{i}-2^{j},2^j+1)$
$=\\gcd(2^{i-j}-1,2^j+1)$
$=\\gcd (2^{i-j}+2^j,2^j+1)$
$若i-j>j$
$\\gcd(2^{i}+1,2^{j}+1)=\\gcd(2^{i-2j}+1,2^j+1)$
$否则$
$\\gcd(2^{i}+1,2^{j}+1)=\\gcd(2^{2j-i}+1,2^j+1)$
$联系辗转相除$
$\\gcd(2^{i}+1,2^{j}+1)=2^{\\gcd(i,j)}+1$
$所以有gcd(i,j)==1且i、j为奇数$
$\\therefore Ans=\\sum_{i=1}^{n}\\sum_{j=1}^{m}[\\gcd(i,j)==1\\&i、j为奇数] $
$=\\sum_{i=1}^{n}\\sum_{j=1}^{m}[gcd(i,j)==1]-\\sum_{i=1}^{\\lfloor \\frac n 2\\rfloor}\\sum_{j=1}^{m}[gcd(i,j)==1]-\\sum_{i=1}^{\\lfloor \\frac m 2\\rfloor}\\sum_{j=1}^{n}[gcd(i,j)==1]$
$=\\sum_{d=1}^{n}\\mu(d)\\lfloor \\frac m d\\rfloor\\lfloor \\frac n d\\rfloor-\\sum_{d=1}^{n}\\mu(d)\\lfloor \\frac m d\\rfloor\\lfloor \\frac n {kd}\\rfloor-\\sum_{d=1}^{n}\\mu(d)\\lfloor \\frac m {kd}\\rfloor\\lfloor \\frac n d\\rfloor$
$其中当d为奇数时,k为2,否则k为1$
对于前10%是为了给暴力分……至于n<=3是为了打表找规律,再结合前10%验证。n,m小于1000……当作给不会反演的分吧……
标程:
1 #define Troy 09/29/2017 2 3 #include<bits/stdc++.h> 4 5 using namespace std; 6 7 typedef long long ll; 8 9 10 const int N=1e7+1; 11 12 int miu[N],prim[N/5],num,sum[N]; 13 bool vis[N]; 14 15 inline void init(){ 16 miu[1]=1; 17 sum[1]=1; 18 for(int i=2;i<N;i++){ 19 if(!vis[i]) 20 prim[++num]=i,miu[i]=-1; 21 for(int j=1;prim[j]*i<N;j++){ 22 vis[i*prim[j]]=1; 23 if(i%prim[j]==0){ 24 miu[i*prim[j]]=0; 25 break; 26 } 27 miu[i*prim[j]]=-miu[i]; 28 } 29 sum[i]=sum[i-1]+miu[i]; 30 } 31 } 32 33 int n,m; 34 35 int main(){ init(); 36 freopen("Troy_1.in", "r", stdin); 37 freopen("Troy_1.out","w",stdout); 38 scanf("%d%d",&n,&m); 39 if(n>m) n^=m^=n^=m; 40 ll ans=0; 41 for(int i=1;i<=n;i++){ 42 ll t=1ll*miu[i]*(n/i)*(m/i),d; 43 if(i&1){ 44 d=1ll*miu[i]*(1ll*(n/i)*(m/i/2)+1ll*(n/i/2)*(m/i)); 45 } 46 else 47 d=1ll*2*miu[i]*(n/i)*(m/i); 48 ans+=t-d; 49 } 50 printf("%lld\\n",ans); 51 }
以上是关于Troywar love Maths——莫比乌斯反演的主要内容,如果未能解决你的问题,请参考以下文章
BZOJ3309: DZY Loves Math 莫比乌斯反演优化
bzoj 3309 DZY Loves Math —— 莫比乌斯反演+数论分块
BZOJ3309 DZY Loves Math 莫比乌斯反演
[BZOJ 3309]DZY Loves Math 莫比乌斯反演