P6267 [SHOI2002] N的连续数拆分
题目描述
所有的正整数均可以表示为一个、两个或者多个连续正整数的和。
给定一个不超过 9×10149\times 10^{14}9×1014 的正整数,求出它可以用几种不同的方法表示成连续正整数之和。例如给出 999,则有三种方式:9,4+5,2+3+49,4+5,2+3+49,4+5,2+3+4。
输入格式
输入一个正整数 nnn,表示要被拆分的正整数。
输出格式
输出方法个数。
输入输出样例 #1
输入 #1
9
输出 #1
3
输入输出样例 #2
输入 #2
11
输出 #2
2
输入输出样例 #3
输入 #3
12
输出 #3
2
说明/提示
n≤9×1014n \leq 9\times 10^{14}n≤9×1014
C++实现
#include <iostream>
#include <cstdio>
#include <cmath>
#define ll long long
using namespace std;
const int MAX = 3e7 + 5;
int cnt,p[MAX >> 1];
ll n;
bool flag[MAX];
void pre (int x);
int main (){
scanf ("%lld",&n);
pre ((int)sqrt (n));
int ans = 1;
for (int j = 1;j <= cnt && (ll)p[j] * p[j] <= n;++j) {
int k = 0;
while (n % p[j] == 0) {
if (j != 1) ++k;
n /= p[j];
}
ans *= (k + 1);
}
if (n > 2) ans *= 2;
printf ("%d\n",ans);
return 0;
}
void pre (int x){
for (int i = 2;i <= x;++i) {
if (!flag[i]) p[++cnt] = i;
for (int j = 1;j <= cnt;++j){
if (i * p[j] > x) break;
flag[i * p[j]] = 1;
if (i % p[j] == 0) break;
}
}
}

后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
用C++实现信奥 P6267 SHOI2002 N的连续数拆分&spm=1001.2101.3001.5002&articleId=148804293&d=1&t=3&u=19053071483a4957a233ffbd1039b4a1)
672

被折叠的 条评论
为什么被折叠?



