UVa 10290 - {Sum+=i++} to Reach N
题目:给你一个数字问将他写成连续的数字的和的形式。有几种写法。
分析:数论。
设拆成的序列个数为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; }
posted on 2017-05-23 11:11 gavanwanggw 阅读(354) 评论(0) 编辑 收藏 举报