• 紫书 例题 10-6 UVa 1635 (二项式定理+唯一分解定理)


    首先可以发现按照题目的算法最后得出来是一个杨辉三角

    如果ai的系数是m的倍数,那么i即为答案

    因为这个系数可能很大,而我们只需要判断倍数

    所以我们就把m分解质因数,然后判断每一个系数

    的质因数的幂是不是大于等于m的该质因数的幂

    然后注意第一个和最后一个可以不用判断

    还有原来的杨辉三角是从0开始算的,

    而这道题的下标是从一开始算,所以都要减去一,然后

    结果加回去

    #include<cstdio>
    #include<vector>
    #include<cmath>
    #include<cstring>
    #define REP(i, a, b) for(int i = (a); i < (b); i++)
    using namespace std;
    
    const int MAXN = 112345;
    bool bad[MAXN];
    vector<int> prime;
    
    void get_prime(int n) //分解n的质因数 
    {
    	int m = floor(sqrt(n) + 0.5);
    	REP(i, 2, m + 1)
    		if(n % i == 0)
    		{
    			prime.push_back(i);
    			while(n % i == 0) n /= i;
    		}
    	if(n > 1) prime.push_back(n);
    }
    
    int main()
    {
    	int n, m;
    	while(~scanf("%d%d", &n, &m))
    	{
    		get_prime(m);
    		memset(bad, false, sizeof(bad));
    		n--;
    		
    		REP(i, 0, prime.size())
    		{
    			int min_e = 0, x;
    			int e = 0, p = prime[i];
    			for(x = m; x % p == 0; x /= p, min_e++);
    			
    			REP(k, 1, n)
    			{
    				for(x = n - k + 1; x % p == 0; x /= p, e++);
    				for(x = k; x % p == 0; x /= p, e--);
    				if(e < min_e) bad[k] = true;
    			}
    		}
    		
    		vector<int> ans;
    		REP(k, 1, n) if(!bad[k]) ans.push_back(k+1);
    		
    		printf("%d
    ", ans.size());
    		if(!ans.empty())
    		{
    			printf("%d", ans[0]);
    			REP(i, 1, ans.size()) printf(" %d", ans[i]);
    		}
    		puts("");
    	}
    	
    	return 0;
    }


  • 相关阅读:
    01人月神话阅读笔记
    第一阶段冲刺010
    03构建之法阅读笔记
    第一阶段冲刺09
    第一阶段冲刺08
    第一阶段冲刺07
    第一阶段冲刺06
    08返回一个整数数组中最大子数组的和
    02构建之法阅读笔记
    请给出一个Scala RDD的HelloWorld例子
  • 原文地址:https://www.cnblogs.com/sugewud/p/9819513.html
Copyright © 2020-2023  润新知