BZOJ1101 Zap 莫比烏斯函數+數論分塊

BZOJ卡流輸入輸出,把cin,cout改成scanf和printf 就過了。 

#include <cstdio>
#include <iostream>
using namespace std;
const int N=1e6+5;
typedef long long ll;
int mui[N],pri[N],vis[N];
void get_mui()
{
    mui[1]=1;
    for(int i=2;i<=1e5;i++)
    {
        if(!vis[i]) 
        {
            pri[++pri[0]]=i;
            mui[i]=-1;
        }
        for(int j=1;j<=pri[0]&&pri[j]*i<=1e6;j++)
        {
            vis[pri[j]*i]=1;
            if(i%pri[j]==0) break;
            else mui[i*pri[j]]=-mui[i];
        }
    }
}
int pre[N];
int main()
{
    int n,a,b,d;
    get_mui();
    for(int i=1;i<=1e5;i++) pre[i]=pre[i-1]+mui[i];
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d%d%d",&a,&b,&d);
        a/=d;
        b/=d;
        int minn=min(a,b);
        ll ans=0;
        for(int l=1,r;l<=minn;l=r+1)
        {
            r=min(minn,min(a/(a/l),b/(b/l)));
            ans+=1LL*(pre[r]-pre[l-1])*(a/l)*(b/l);
        }
        printf("%lld\n",ans);
    }
}

 

發佈了74 篇原創文章 · 獲贊 4 · 訪問量 5047
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章