hdu 2841 Visible Trees

来源:互联网 发布:电脑没网络手机能连上 编辑:程序博客网 时间:2024/06/01 18:20

点这里

素数打表

素因子分解

容斥定理

固定m 在1-n中找与m互质的数

#include <iostream>#include <string.h>#include <stdio.h>#include <math.h>using namespace std;const int maxn=1e6+5;int prime[maxn];int vis[maxn],cnt,p;typedef long long ll;ll gcd(ll n, ll m){    if(m==0)        return n;    else        return gcd(m,n%m);}void init(){    cnt = 0;    memset(vis,0,sizeof(vis));    for(int i=2; i<maxn; i++)    {        if(!vis[i])        {            prime[cnt++]=i;            for(int j=i+i; j<maxn; j+=i)                vis[j]=1;        }    }}int yz[maxn];void syzfj(ll n){           p=0;ll x=n;        for(int i=0; i<cnt&&prime[i]*prime[i]<=n; i++)        {    ll tmp=0;            if(n%prime[i]==0)            {               yz[p]=prime[i];                while(x%prime[i]==0)                {                    tmp++;                    x/=prime[i];                }                p++;            }        }        if(x>1)        {           yz[p]=x;           p++;        }}ll ttt(int tt,int i){          syzfj(i);ll ans=0;           for(int i=1; i<(1<<p); i++)        {            ll cj=1;int c=0;            for(int j=0; j<p; j++)            {                if(i&(1<<j))                {                     c++;                   cj*=yz[j];                }            }                if(c%2==0)                    ans-=tt/cj;                else                    ans+=tt/cj;        }        return tt-ans;}int main(){   int n,t,m;      cin>>t;       init();       while(t--)       {           cin>>n>>m;           ll ans=0;           for(int i=1;i<=n;i++)             ans+=ttt(m,i);           cout<<ans<<endl;       }    return 0;}