莫比乌斯函数——bzoj2440: [中山市选2011]完全平方数
http://www.lydsy.com/JudgeOnline/problem.php?id=2440
直接上popoqqq的题解了;
https://wenku.baidu.com/view/fbec9c63ba1aa8114431d9ac
我一直不理解莫比乌斯函数,现在看了大神的资料,才懂了;
但是我很好奇,为什么我周围的同学他妈全懂的;
为什么我周围的同学省选数论题一刀一刀ac;
为什么他门连这种最基本的题目都不做;
为什么他们无法把我教懂;
一定是我太笨了;
以前我们做过比赛一道题;
问x以内的所有平方数;
那个时候zyy就说这个是莫比乌斯反演;
szb大佬现场AC;
但为什么是莫比乌斯?
为什么?????
而且为什么那个莫比乌斯是反的???
为什么???
没有人给我清楚的解释,包括两位大佬;
然后呢,大家就陆陆续续AC;
直到今天,我才知道真相;
另外线性筛可以筛一切积性函数;
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#define Ll long long
using namespace std;
const Ll N=1e6;
int u[N+50],pri[N+50],tot;
bool com[N+50];
Ll n,m;
void mobius(){
u[1]=1;
for(int i=2;i<=N;i++){
if(!com[i]){pri[++tot]=i;u[i]=-1;}
for(int j=1;j<=tot&&pri[j]*i<=N;j++){
int now=pri[j]*i;
com[now]=1;
if(i%pri[j])u[now]=-u[i];else{
u[now]=0;
break;
}
}
}
}
Ll check(Ll x){
Ll ans=0;
for(Ll i=1;i*i<=x;i++)ans+=x/(i*i)*u[i];
return ans;
}
int main()
{
mobius();
scanf("%lld",&m);
while(m--){
scanf("%lld",&n);
Ll l=0,r=1644934081,ans=1644934081,mid,temp;
while(r>=l){
mid=(l+r)/2;
temp=check(mid);
if(temp==n)ans=min(ans,mid);
if(temp<n)l=mid+1;else r=mid-1;
}
printf("%lld\n",ans);
}
}
以前在初中的时候学过古文;
就是说一个人清晨知道真理;
傍晚就死也可以;
现在我知到为什么了;
另外,我非常感激popoqqq;
因为我们学校的资源,向来是不外传的;
我知道了资源的重要性;