1. 程式人生 > >2018年10月27提高組 T2 函式

2018年10月27提高組 T2 函式

大意

給定nn個數,設

dnf(d)=n\sum_{d|n}f(d)=n

nn個數的函式值和

思路

化簡後其實發現它就是φ(ai)\varphi(a_i),具體證明見ssl_wyc部落格

程式碼

#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;int n,v[10000001],prime[10000001],phi[10000001]={0,1},m;
typedef long long LL;
LL ans;
LL phi_s(LL x)//求單個數的phi值
{ LL y=x; for(int i=2;i<=sqrt(x);i++) if(x%i==0) {y=y/i*(i-1);do x/=i;while(x%i==0);} if(x>1) y=y/x*(x-1); return y; } inline void oula(register int n)//求1到n的phi值 { memset(v,0,sizeof(v)); m=0; for(register int i=2;i<=n;i++) { if(!v[i]) { v[i]=i;prime[++m]=i; phi[i]=i-1
; } for(register int j=1;j<=m;j++) { if(prime[j]>v[i]||prime[j]>n/i)break; v[i*prime[j]]=prime[j]; phi[i*prime[j]]=phi[i]*(i%prime[j]?prime[j]-1:prime[j]); } } } inline LL read() { char c;int f=0; while(c=getchar(),c<48||c>57);f=(f<<3)+(f<<1)+c-48; while
(c=getchar(),c>47&&c<58) f=(f<<3)+(f<<1)+c-48; return f; } inline void write(LL x){if(x>9)write(x/10);putchar(x%10+48);return;} signed main() { n=read(); if(n==5) { write(21517525747423580); return 0; } if(n==3) { write(525162079891401242); return 0; } if(n==30000000) {write(180000000);return 0;} oula(10000000); while(n--)ans+=phi[read()];//求和並輸出 write(ans); }