1968: [Ahoi2005]COMMON 约数研究
Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 2260 Solved: 1735
[Submit][Status][Discuss]
Description
Input
只有一行一个整数 N(0 < N < 1000000)。
Output
只有一行输出,为整数M,即f(1)到f(N)的累加和。
Sample Input
3
Sample Output
5
第一次写博客,挑个简单点的吧。。。。
这个题吗,由于它是个积性函数,所以可以线性筛约数个数,
至于思想。。用类似推倒约数和定理的方法就好了
废话不多说
上代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long LL;
const int N =1000010;
int n;
LL g[N],ans=1;
int tot,prime[N];
bool book[N];
inline LL dltdivisor(LL a,LL b)
{
while(a%b==0)
{
a=a/b;
}
return g[a];
}
inline void divisor()
{
g[1]=1;
for(int i=2;i<=n;i++)
{
if(!book[i])
{
tot++;prime[tot]=i;
g[i]=2;
}
for(int j=1;j<=tot;j++)
{
if(prime[j]*i>n)break;
book[i*prime[j]]=1;
g[i*prime[j]]=dltdivisor(i,prime[j])+g[i];
if(i%prime[j]==0)break;
}
ans+=g[i];
//cout<<g[i]<<endl;
}
}
int main()
{
scanf("%d",&n);
divisor();
cout<<ans;
}