hdu1695 dfs+欧拉函数

来源:互联网 发布:js prop checked 编辑:程序博客网 时间:2024/05/21 06:39
很经典的题,值得一做。。。
#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>#include <cmath>#include <vector>using namespace std;#define ll __int64#define maxn 160000bool f[maxn] ;ll phi[maxn] ;//记录欧拉函数值ll prime[maxn] ;vector<ll>g[maxn];void init(){    int num=0;    phi[1]=1;    for(int i=2;i<maxn;i++)    {        if(!phi[i])        {            num++;            prime[num]=i;            for(int j=i;j<maxn;j+=i)            {                if(!phi[j])                {                    phi[j]=j;                }                phi[j]-=phi[j]/i;            }        }    }    for(int i=2;i<=1e5;i++)    {        int tmp=i;        int j=1;        for(;prime[j]*prime[j]<=i;j++)        {            if(tmp % prime[j]==0)            {                g[i].push_back(prime[j]);                while(tmp%prime[j]==0)                {                    tmp/=prime[j];                }            }            if(tmp==1)                break;        }        if(tmp>1)            g[i].push_back(tmp);    }}int dfs(ll x,ll b,ll now){    ll res=0;    for(ll i=x;i<g[now].size();i++)      res = res + b/g[now][i] - dfs(i+1,b/g[now][i],now) ;   return res ;}int main(){    int T ,i;    init() ;    scanf("%d",&T);    int cas = 0 ;    ll a,b,c,d ,k;    while(T--)    {        scanf("%I64d%I64d%I64d%I64d%I64d",&a,&b,&c,&d,&k) ;        if(b > d ) swap(b,d) ;        if(k == 0|| k>b||k>d)        {            printf("Case %d: 0\n",++cas);            continue ;        }        b = b/k ;        d = d/k  ;        ll ans = 0 ;        for(i = 1; i <= b;i++)           ans+=phi[i] ;        for(i = b+1; i <= d;i++)        {            ans=ans + b - dfs(0,b,i);        }        printf("Case %d: %I64d\n",++cas,ans) ;    }    return 0;}

0 0
原创粉丝点击