莫比乌斯函数——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;
因为我们学校的资源,向来是不外传的;
我知道了资源的重要性;

posted @ 2017-04-11 20:30  largecube233  阅读(103)  评论(0编辑  收藏  举报