码迷,mamicode.com
首页 > 其他好文 > 详细

UVa 10290 - {Sum+=i++} to Reach N

时间:2015-03-19 16:30:48      阅读:104      评论:0      收藏:0      [点我收藏+]

标签:

题目:给你一个数字问将他写成连续的数字的和的形式,有几种写法。

分析:数论。设拆成的序列个数为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;
}



UVa 10290 - {Sum+=i++} to Reach N

标签:

原文地址:http://blog.csdn.net/mobius_strip/article/details/44457781

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!