针对CSP-J/S的每日一练(5)

一、审题

题目描述

珂朵莉有一个正整数数列 { a n } \{a_n\} {an},对于所有的 i ≥ 1 i\geq 1 i1 a i + 1 = a i × i + 1 a_{i+1}=a_{i}\times i+1 ai+1=ai×i+1
现在她定义了一个新的数列 { b n } \{b_n\} {bn},对于所有的 i ≥ 1 i\geq 1 i1 b i b_i bi 表示有多少个 a j a_j aj,满足 1 ≤ j < i 1\leq j1j<i a j a_j aj a i a_i ai 的因子。
请你帮助珂朵莉计算出数列 { b n } \{b_n\} {bn} 的前 N N N 项。

输入格式

输入文件的第一行包含一个整数 N N N

输出格式

输出文件共 N N N 行,第 i i i 行表示 b i b_i bi 的值。

输入样例

10

输出样例

0
1
1
1
2
1
3
1
2
4

题目来源

2018 CSP-J No.3

二、思路

珂朵莉的数列 a 1 ⋯ n a_{1\cdots n} a1n 有一个特点: a i   m o d   a j > 0 ( i > j ) a_i \bmod a_j>0(i>j) aimodaj>0(i>j)。因为如果存在 i > j i>j i>j,满足 a j ∣ a i a_j|a_i ajai,那么 a i + 1   m o d   a j = a i × i + 1   m o d   a j = 1 a_{i+1}\bmod a_j=a_i\times i+1 \bmod a_j=1 ai+1modaj=ai×i+1modaj=1,那么 a j ∣ a i + 1 a_j|a_{i+1} ajai+1,所以不满足原式。所以我们考虑从 1 1 1 开始枚举每个 a i a_i ai,统计有多少个 a j ( j < i ) a_j(jaj(j<i) 满足 a i   m o d   a j = 0 a_i\bmod a_j=0 aimodaj=0。时间复杂度 O ( n 2 ) O(n^2) O(n2)

三、示例代码

#include 
using namespace std;

const int MAXN = 1005;
int a[MAXN];

int main()
{
    int n;
    cin >> n;
    int ans = 0;
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j < i; j++)
        {
            if (a[i] % a[j] == 0) { // 如果a[i]能被a[j]整除
                ans++; // 答案加1
            }
        }
    }
    cout << ans;
    return 0;
}

你可能感兴趣的:(算法,c++,数据结构)