您的位置:首页 > 其它

hdu 2841 Visible Trees

2017-08-08 19:21 302 查看
点这里

素数打表

素因子分解

容斥定理

固定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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: