UVa 10290

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

分析:数论。

设拆成的序列个数为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;
}



原文地址:https://www.cnblogs.com/gavanwanggw/p/6893168.html