ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

「JLOI2014」聪明的燕姿

2019-11-01 21:57:08  阅读:359  来源: 互联网

标签:prime 50000 燕姿 JLOI2014 int vis 聪明 rg include


传送门
Luogu

解题思路

很容易想到直接构造合法的数,但是这显然是会T飞的。
我们需要考虑这样一件事:
对于一个数 \(n\),对其进行质因数分解:
\[n=\sum_{i=1}^x p_i^{c_i}\]
那么就会有:
\[\sigma(n)=\prod_{i=1}^x \sum_{j=1}^{c_i}p^j\]
可以证明 \(\sigma(n)\) 和 \(n\) 同级,所以这个质因子 \(p_i\le \sqrt{S}\),所以我们可以直接爆搜出来所有小于 \(\sqrt{S}\) 的质数,特判一下每一层dfs时的 \(S-1\) 是否为质数,然后算答案。

细节注意事项

  • 爆搜题,你们懂得。。。

参考代码

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cctype>
#include <cmath>
#include <ctime>
#define rg register
using namespace std;
template < typename T > inline void read(T& s) {
    s = 0; int f = 0; char c = getchar();
    while (!isdigit(c)) f |= c == '-', c = getchar();
    while (isdigit(c)) s = s * 10 + (c ^ 48), c = getchar();
    s = f ? -s : s;
}

int vis[50000], num, prime[50000];
int cnt, ans[500000];

inline void seive() {
    vis[1] = 1;
    for (rg int i = 2; i < 50000; ++i) {
        if (!vis[i]) prime[++num] = i;
        for (rg int j = 1; j <= num && i * prime[j] < 50000; ++j) {
            vis[i * prime[j]] = 1;
            if (i % prime[j] == 0) break;
        }
    }
}

inline bool isprime(int x) {
    if (x <= 1) return 0;
    if (x == 2) return 1;
    for (rg int i = 2; i * i <= x; ++i)
        if (x % i == 0) return 0;
    return 1;
}

inline void dfs(int x, int i, int s) {
    if (x == 1) { ans[++cnt] = s; return; }
    if (isprime(x - 1) && x > prime[i]) ans[++cnt] = s * (x - 1);
    for (rg int j = i; prime[j] * prime[j] <= x; ++j) {
        int last = prime[j], sum = prime[j] + 1;
        for (; sum <= x; last *= prime[j], sum += last)
            if (x % sum == 0) dfs(x / sum, j + 1, s * last);
    }
}

inline void solve(int x) {
    if (x == 1) { puts("1"), puts("1"); return ; }
    cnt = 0, dfs(x, 1, 1);
    printf("%d\n", cnt);
    sort(ans + 1, ans + cnt + 1);
    for (rg int i = 1; i <= cnt; ++i)
        printf("%d%c", ans[i], " \n"[i == cnt]);
}

int main() {
#ifndef ONLINE_JUDGE
    freopen("in.in", "r", stdin);
#endif
    seive();
    int n;
    while (scanf("%d", &n) != EOF) solve(n);
    return 0;
}

完结撒花 \(qwq\)

标签:prime,50000,燕姿,JLOI2014,int,vis,聪明,rg,include
来源: https://www.cnblogs.com/zsbzsb/p/11779749.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有