zoukankan      html  css  js  c++  java
  • PAT甲级1103. Integer Factorization

    PAT甲级1103. Integer Factorization

    题意:

    正整数N的K-P分解是将N写入K个正整数的P次幂的和。你应该写一个程序来找到任何正整数N,K和P的N的K-P分解。

    输入规格:

    每个输入文件包含一个测试用例,它给出一行三个正整数N(<= 400),
    K(<= N)和P(1 <P <= 7)。一行中的数字用空格分隔。

    输出规格:

    对于每种情况,如果解决方案存在,输出格式如下:

    N = n1 ^ P + ... nK ^ P

    其中ni(i = 1,... K)是第i个因子。所有因素必须以不增加的顺序打印。

    注意:解决方案可能不是唯一的。例如,
    因子分解169有9种解决方案,如122 + 42 + 22 + 22 + 12,或112 + 62 + 22 + 22 + 22或更多。您必须输出具有因子的最大和的一个。如果有关系,则必须选择最大因子序列 - 序列{a1,a2,... aK}被认为大于{b1,b2,...
    bK}如果存在1 <= L <= K,使得对于i <L和aL> bL,ai = bi

    如果没有解决方案,简单输出“不可能”。

    思路:

    dfs + 剪枝。慎用stl。把vector换成数组就a了。。

    ac代码:

    C++

    #include<iostream>
    #include<cstdio>
    #include<string>
    #include<algorithm>
    #include<queue>
    #include<vector>
    #include<cstring>
    #include<stdio.h>
    #include<map>
    #include<cmath>
    #include<unordered_map>
    #include<unordered_set>
    
    using namespace std;
    
    int n, k, p;
    int res[401];
    int temp[401];
    int maxsum = 0;
    int mypow[21];
    int last;
    
    void caculate(int n,int sum, int len)
    {
    	if (n < 0 || len > k) return;	
    	if (k == len && n == 0) 
    	{
    		if (sum > maxsum)
    		{
    			maxsum = sum;
    			for (int i = 0; i < k; i++)
    				res[i] = temp[i];
    		}
    		return; 
    	}
    
    	//long long num;
    	for (int i = last; i >= 1; i--)
    	{
    		if (mypow[i] > n) continue;
    		if ((k - len) * mypow[i] < n) break;
    		temp[len] = i;
    		last = i;
    		caculate(n - mypow[i], sum + i,len + 1);
    	}
    }
    
    //bool cmp(vector<int>& a, vector<int>& b)
    //{
    //	for (int i = 0; i < k; i++)
    //	{
    //		if (a[i] != b[i]) return a[i] > b[i];
    //	}
    //}
    
    int main()
    {
    	scanf("%d %d %d", &n, &k, &p);
    	for (int i = 1; i <= 20; i++)
    	{
    		mypow[i] = i;
    		for (int j = 1; j < p; j++)
    		{
    			mypow[i] *= i;
    		}
    	}
    
    	last = 20;
    	caculate(n, 0, 0);
    
    	//printf("%d
    ", res.size());
    	if (res[0] == 0) printf("Impossible
    ");
    	else
    	{
    		printf("%d = ", n);
    		for (int i = 0; i < k - 1; i++)
    			printf("%d^%d + ", res[i],p);
    		printf("%d^%d
    ", res[k - 1], p);
    	}
        return 0;
    }
    
  • 相关阅读:
    asp.net textbox 控件如何清除缓存
    extjs Accordion 怎样把展开符号:加号(+)放在左边?
    ORACLE 调试输出,字符串执行函数
    Oracle中table函数的应用
    Oracle LAST_DAY(d)
    Oracle 管道化表函数(Pipelined Table)[转载]
    ext中fieldLabel文本太宽的问题,以及Panel居中显示
    什么是泛型(C#)
    设置Ext tab的宽度自动适应
    js选择日期即时把两个日期相差天数显示出来?
  • 原文地址:https://www.cnblogs.com/weedboy/p/7340863.html
Copyright © 2011-2022 走看看