uestc 1720无平方因子数

求素数  然后容斥原理
// n之内有平方因子的数的个数sum =n/(2^2) + n/(3^2)+……+n/(k^2) - n/(2^2 * 3^2)-……+…….

 

// #pragma comment(linker, "/STACK:1024000000,1024000000")

#include <iostream>

#include <algorithm>

#include <queue>

#include <stack>

#include <math.h>

#include <stdio.h>

#include <string.h>

using namespace std;

#define MOD 1000000007

#define maxn 1000010

#define maxm 1000010

#define LL long long

LL pr[maxn];

int p;

void getprime(){

    int i,j;

    for(i=4;i<maxn;i+=2) pr[i]=1;

    for(i=3;i*i<maxn;i+=2)

        if(!pr[i])

         for(j=i*i;j<maxn;j+=i)

           pr[j]=1;

    pr[p++]=2;

    for(i=3;i<maxn;i+=2)

        if(!pr[i])pr[p++]=i;

}

LL n,m,sum;

void dfs(int id,int dep,LL ji){

    LL tp;

    int i;

    for(i=id;i<p;i++){

        tp=ji*pr[i];

        if(tp>m) return;

        if(dep%2)

            sum+=n/(tp*tp);

        else

            sum-=n/(tp*tp);

            dfs(i+1,dep+1,tp);

    }

}

int main(){

    getprime();

    int T;

    scanf("%d",&T);

    while(T--){

       // scanf("%I64d",&n);

        scanf("%lld",&n);

        m=sqrt(n+1.0);

        sum=0;

        dfs(0,1,1);

      //  printf("%I64d\n",n-sum);

        printf("%lld\n",n-sum);

    }

}

 

你可能感兴趣的:(UE)