zoukankan      html  css  js  c++  java
  • 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;
    }
    



  • 相关阅读:
    U10783 名字被和谐了
    P1151 子数整数
    P2756 飞行员配对方案问题
    P3227 [HNOI2013]切糕
    BZOJ 2127: happiness(最小割解决集合划分)
    linux脚本初体验
    130902 周赛
    Citrix 服务器虚拟化之三十二 XenConvert
    数据字典统一管理,动态下拉框
    [置顶] oracle 数据库表中转换成java代码
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/6893168.html
Copyright © 2011-2022 走看看