codeforces 546D (数学 水)

来源:互联网 发布:淘宝怎么查看旺旺号 编辑:程序博客网 时间:2024/06/07 06:47

题目链接:点击这里

题意:给出一个数字,每次用他除以一个因子。问最多可以除几次。

一个数字要能够除最多的数显然每次都除以一个素因子。所以直接一边线性筛找出每一个数的最小质因子,然后像DP一遍统计每素因子数的前缀和就行了。

#include <bits/stdc++.h>using namespace std;#define maxn 5000005bool vis[maxn];int prime[maxn], cnt;long long num[maxn], sum[maxn];int n, a, b;void init () {    cnt = 0;    memset (vis, 0, sizeof vis);    for (int i = 2; i < maxn; i++) {        if (!vis[i]) {            prime[cnt++] = i;            num[i] = i;        }        for (int j = 0; j < cnt; j++) {            if (1LL*i*prime[j] >= maxn) break;            vis[i*prime[j]] = 1;            num[i*prime[j]] = prime[j];            if (i%prime[j] == 0) {                break;            }        }    }    sum[0] = sum[1] = 0;    for (int i = 2; i < maxn; i++) sum[i] = 1+sum[i/num[i]];    for (int i = 1; i < maxn; i++) sum[i] += sum[i-1];}int main () {    init ();    scanf ("%d", &n);    while (n--) {        scanf ("%d%d", &a, &b);        printf ("%lld\n", sum[a]-sum[b]);    }    return 0;}
0 0
原创粉丝点击