Comet OJ - Contest #8 神奇函数

Posted the-pines-of-star

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Comet OJ - Contest #8 神奇函数相关的知识,希望对你有一定的参考价值。

 

 

题意:技术图片

 

 思路:

       首先我们打表观察得到,f(x)为 x分解质因数之后 ∏pi^(ti/2) 

    再分析可得,∑f(i)=n/(1*1)*1*只为1的个数+n/(2*2)*2*只为2的个数+... 

       但是结果超时。

            在进行分析可得,只为x的个数 就是phi(x)。

技术图片
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define dep(i,a,b) for(int i=b;i>=a;i--)
using namespace std;
#define ll long long
const int N=3e5+5;
ll rd()

    ll x=0,f=1;char ch=getchar();
    while(ch<0||ch>9)if(ch==-)f=-1;ch=getchar();
    while(ch>=0&&ch<=9)x=x*10+ch-0;ch=getchar();
    return x*f;

int T;
ll n;
ll f[10000010],ans,sum;
int main()

    T=rd();
    while(T--)
    
        ans=0;sum=0;
        n=rd();
        int p=sqrt(n);
        dep(i,2,p)
        
            int x=i+i;
            f[i]=n/(1ll*i*i);
            while(x<=p)
                
                f[i]-=f[x];
                x+=i;
            
            ans=ans+1ll*f[i]*i;
            sum+=f[i];
        
        printf("%lld\\n",ans+n-sum); 
    
View Code

 

技术图片
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define dep(i,a,b) for(int i=b;i>=a;i--)
using namespace std;
#define ll long long
const int N=1e7+5;
ll rd()

    ll x=0,f=1;char ch=getchar();
    while(ch<0||ch>9)if(ch==-)f=-1;ch=getchar();
    while(ch>=0&&ch<=9)x=x*10+ch-0;ch=getchar();
    return x*f;

int prime[N+10],phi[N+10],num[N+10],flag[N+10],l=0;
void isprime()

    phi[1]=1;
    for(int i=2;i<=N;i++)
    
        if(!flag[i]) 
        
            prime[++l]=i;
            phi[i]=i-1; 
        
        for(int j=1;j<=l;j++)
        
            if(1ll*prime[j]*i>N) break;
            phi[i*prime[j]]=phi[i]*(i%prime[j]?prime[j]-1:prime[j]);
            flag[prime[j]*i]=1;
            if(i%prime[j]==0) break;
        
    

int T;
ll n;
ll f[10000010],ans,sum;
int main()

    isprime();
    T=rd();
    while(T--)
    
        ans=0;sum=0;
        n=rd();
        int p=sqrt(n);
        dep(i,1,p)
        
            int x=i+i;
            f[i]=n/(1ll*i*i);
            ans=ans+1ll*f[i]*phi[i];
        
        printf("%lld\\n",ans); 
    
View Code

 

以上是关于Comet OJ - Contest #8 神奇函数的主要内容,如果未能解决你的问题,请参考以下文章

符文能量(Comet OJ - Contest #8)

Comet OJ - Contest #8题解

Comet OJ - Contest #15题解

Comet OJ - Contest #8 F.黄金体验 LCT 维护长链剖分+线段树

Comet OJ - Contest #1

Comet OJ Contest #3