为了我们心爱的京电
Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others)
京州电子科技大学遭遇废校危机,为了保护我们心爱的学校,N位魔法少女站了出来,她们能做的就是……成为偶像! 每个魔法少女都拥有一定的人气,他们中的每个人的人气计算方式如下: 假设某个魔法少女的学号为a,学号从1到a-1的共a-1位同学都会为她应援,学号为i的同学能让这位魔法少女增加gcd(a,i)的人气值。 这N位魔法少女最终能否拯救我们的学校呢,试着计算一下他们的总人气值吧!
Input
第一行有一个数字N,表示魔法少女的个数 第二行共有N个数字,分别是a[i],表示第i为魔法少女的学号 其中1<=N<=1e4, 1<=a[i]<=1e6
Output
输出一个数,N位魔法少女的总人气值
Sample input and output
Sample Input | Sample Output |
---|---|
2 5 6 | 13 |
举例来说对于12,12因子有1,2,3,4,6,12,φ(12/1)*1+φ(12/2)*2+φ(12/3)*3+φ(12/4)*4+φ(12/6)*6+φ(12/12)*12,也能写为这种形式Σphi(d)*a[i]/d,d为a[i]的约数,两者是一样的我们只要枚举a[i]的约数就好啦
#include <iostream>
#include <cstdio>
#include <cstring>
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <math.h>
using namespace std;
inline long long phi(long long x){
long long a=x;
long long m=sqrt(x+0.5);
for(long long i=2;i<=m;i++){
if(x%i==0){
a=a/i*(i-1);
while(x%i==0)x/=i;
}
}
if(x>1)a=a/x*(x-1);
return a;
}
int main(){
long long t;
while(~scanf("%lld",&t)){
long long ans=0;
for(int j=0;j<t;j++)
{
long long n;
scanf("%lld",&n);
long long m;
m=floor(sqrt(1.0*n));
long long i;
for(i=1;i<=m;++i){
if(n%i==0){
ans+=(long long)phi(n/i)*i;
if(i*i<n)ans+=(long long)(n/i)*phi(i);
}
}
ans-=n;
}
printf("%lld\n",ans);
}
return 0;
}