[51nod1040]最大公約數之和
阿新 • • 發佈:2019-01-27
Description
求
n<=10^9
Solution
這道題有多種做法。
我們設
那麼f應該是積性函式。(證明自行腦補)
也就是說我們要求出來
直接推式子似乎很麻煩,我們換個思路。
如何從
首先,因為我們可以把f(p^k)*p,那麼就構成了f(p^k+1)的答案中所有不為1的部分.
(顯然
那麼剩下的為1的就是
於是我們得到了
於是就解決了。
然而,我發現似乎只有我一個人想用積性函式的方法。
其餘的都是機智的直接
因為我們的答案都是n的因數。那麼我們把它分解質因數,列舉每個因數x,我們就是要求1~n有多少個數k滿足
於是暴力求
Code
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define fo(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
typedef long long ll;
ll ans;
int a[32],b[32 ],n;
int main() {
scanf("%d",&n);int i=2;ans=1;
fo(i,2,sqrt(n)) {
if (!(n%i)) a[++a[0]]=i;
while (!(n%i)) b[a[0]]++,n/=i;
}
if (n>1) a[++a[0]]=n,b[a[0]]=1;
fo(i,1,a[0]) {
ll sum=1,x=1;
fo(j,1,b[i]) sum=sum*a[i]+x*(a[i]-1),x*=a[i];
ans*=sum;
}
printf ("%lld",ans);
}