hihoCoder 1785

线性筛 + 递推

复制代码
#include <bits/stdc++.h>

const int N = 1e6 + 10, Mod = 1e9 + 7;

int n;
int phi[N], prime[N], tot, ans;
bool mark[N];
int k;
int f[N];

void Getphi() {
    for(int i = 2; i <= k; i ++) {
        if(!mark[i]) {
            prime[++ tot] = i;
        }
        for(int j = 1; j <= tot; j ++) {
            if(i * prime[j] > N)  break;
            mark[i * prime[j]] = 1;
        }
    }
    for(int i = 1; i <= tot; i ++) f[prime[i]] = 1;
}

int main() {
    std:: cin >> k;
    Getphi();
    for(int i = 0; i <= k; i ++) f[i] = 1;
    for(int i = 2; i <= k / 2; i ++)
        for(int j = 2; i * j <= k; j ++)
            //if(!vis[i * j])
                f[i * j] = (f[i * j] + f[i]) % Mod;
    std:: cout << f[k];
    return 0;
}
复制代码

 

posted @   xayata  阅读(93)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示