ACM-ICPC 2018 南京赛区网络预赛 J Sum(欧拉线性筛+思维)

Sum

问题分析

题意:我们将类似于 6=23 6 = 2 ⋅ 3 这样的数称为 asquarefreeinteger a s q u a r e − f r e e i n t e g e r ,而 12=223 12 = 2 2 ⋅ 3 这样的就不是,因为有平方因子。但是 6 6 还可以被拆分成 6=16=32=61 6 = 1 ⋅ 6 = 3 ⋅ 2 = 6 ⋅ 1 ,所以对于 6 6 ,我们有 4 4 种分解方式。因此我们设定 f(6)=4 f ( 6 ) = 4 。现在要求 ni=1f(i) ∑ i = 1 n f ( i )
题解:
首先我们可以知道
1. 对于任意一个质数 p p f(p)=2 f ( p ) = 2
2. 对于任意一个正整数 n n ,可以分解成 n=pe11pe22...pekk n = p 1 e 1 ⋅ p 2 e 2 . . . p k e k 的形式,那么如果有 ei3 e i ≥ 3 ,则 f(n)=0 f ( n ) = 0
3. 已知 n=pe11x n = p 1 e 1 ⋅ x ,则有

f(n)=1f(x),f(pe11)f(x),if e1=2 if e1=1,andx%pe110=f(x),2f(x),if e1=2 if e1=1  f ( n ) = { 1 ⋅ f ( x ) , if  e 1 = 2   f ( p 1 e 1 ) ⋅ f ( x ) , if  e 1 = 1 , a n d x % p 1 e 1 ≠ 0 = { f ( x ) , if  e 1 = 2   2 ⋅ f ( x ) , if  e 1 = 1  

为什么哩,因为如果 e1=2 e 1 = 2 ,那么对于 n n pe11 p 1 e 1 的贡献就只有 1 1 p21=p1p1 p 1 2 = p 1 ⋅ p 1 ,所以 f(p21)=1 f ( p 1 2 ) = 1 ,而当 e1=1 e 1 = 1 时,贡献为 2 2 ,因为此时 p1 p 1 为质数, f(p1)=2 f ( p 1 ) = 2 ,但是得同时保证 xpe11 x 和 p 1 e 1 没 有 大 于 1 的 共 同 因 子

代码

#include
using namespace std;
const int N = 2e7+10;

int prime[N],f[N];
bool vis[N];

void fuck() {
    f[1] = 1;
    for (int i = 2, k = 0; i < N; ++i) {
        if (vis[i] == 0)
            prime[k++] = i, f[i] = 2;
        for (int j = 0; prime[j] * i < N && j < k; ++j) {
            int num = i * prime[j];
            vis[num] = 1;
            if (i % prime[j])
                f[num] = f[i] * f[prime[j]]; // f[num] = f[i] * 2
            else if (i % (prime[j] * prime[j]) == 0)
                f[num] = 0;
            else {
                f[num] = f[num / (prime[j] * prime[j])];
                break;
            }
        }
    }
}


int main() {
    int T, n;
    fuck();
    for (int i = 1; i < N; ++i)
        f[i] += f[i - 1];
    scanf("%d", &T);
    while (T--) {
        scanf("%d", &n);
        printf("%d\n", f[n]);
    }
    return 0;
}

你可能感兴趣的:(算法,ACM,欧拉定理,ACM)