题目:给你一个数字问将他写成连续的数字的和的形式,有几种写法。
分析:数论。设拆成的序列个数为k,我们分两种情况讨论:
1.拆成奇数个连续数,那么设中位数是a,则有n = k * a;
2.拆成偶数个连续数,那么设中位数是a与a+1,则有n = k / 2 *(a+a+1);
综上所述,本问题就是将n拆成2个数的乘积的形式,且其中一个一定为奇数;
问题转化成求解n中奇数因子的个数,这里求出所有的奇素因子计算组合数即可。
说明:实际的数据规模没有题面上那么大╮(╯▽╰)╭。
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
using namespace std;
int visit[3000010];
int prime[300010];
int sizes[30010];
int main()
{
//筛法计算素数
memset(visit, 0, sizeof(visit));
int count = 0;
for (int i = 2 ; i < 3000001 ; ++ i) {
if (!visit[i])
prime[count ++] = i;
for (int j = 0 ; j < count && i*prime[j] < 3000001 ; ++ j) {
visit[i*prime[j]] = 1;
if (i%prime[j] == 0) break;
}
}
long long n;
while (cin >> n) {
while (n > 0LL && n%2LL == 0LL) n /= 2LL;
int number = 0;
for (int i = 1 ; i < count && n > 1LL ; ++ i) {
if (n < prime[i]*prime[i]) break;
if (n%prime[i] == 0LL) {
sizes[++ number] = 0;
while (n%prime[i] == 0LL) {
n /= prime[i];
sizes[number] ++;
}
}
}
if (n > 1LL) sizes[++ number] = 1;
long long ans = 1LL;
for (int i = 1 ; i <= number ; ++ i)
ans = ans*(sizes[i]+1LL);
cout << ans << endl;
}
return 0;
}