打卡信奥刷题(1545)用C++实现信奥 P6267 [SHOI2002] N的连续数拆分

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}n9×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考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值