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