1103. Integer Factorization (30)

102 篇文章 0 订阅
37 篇文章 0 订阅

1103. Integer Factorization (30)

时间限制
1200 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue

The K-P factorization of a positive integer N is to write N as the sum of the P-th power of K positive integers. You are supposed to write a program to find the K-P factorization of N for any positive integers N, K and P.

Input Specification:

Each input file contains one test case which gives in a line the three positive integers N (<=400), K (<=N) and P (1<P<=7). The numbers in a line are separated by a space.

Output Specification:

For each case, if the solution exists, output in the format:

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

where ni (i=1, ... K) is the i-th factor. All the factors must be printed in non-increasing order.

Note: the solution may not be unique. For example, the 5-2 factorization of 169 has 9 solutions, such as 122 + 42 + 22 + 22 + 12, or 112+ 62 + 22 + 22 + 22, or more. You must output the one with the maximum sum of the factors. If there is a tie, the largest factor sequence must be chosen -- sequence { a1, a2, ... aK } is said to be larger than { b1, b2, ... bK } if there exists 1<=L<=K such that ai=bi for i<L and aL>bL

If there is no solution, simple output "Impossible".

Sample Input 1:
169 5 2
Sample Output 1:
169 = 6^2 + 6^2 + 6^2 + 6^2 + 5^2
Sample Input 2:
169 167 3
Sample Output 2:
Impossible
输入N K P
输出N = K个数的P次方和;
如果不存在 Impossible;
   如果只存在一个就按着非升序每个数的P次方按照样例输出
         如果有多个,那么取两个非升序列中小的数更大的那个,比如a4 a3 a2 a1 a0
                                                         b4 b3 b2 b1 b0
                                        比较a0?b0,如果a0>b0那么取第一行;
                                                     否则如果a0==b0那么接着比较a1,b1;
                                                         否则a0<b0取第二行; 

  

评测结果

时间 结果 得分 题目 语言 用时(ms) 内存(kB) 用户
9月14日 18:06 答案正确 30 1103 C++ (g++ 4.7.2) 464 308 datrilla

测试点

测试点 结果 用时(ms) 内存(kB) 得分/满分
0 答案正确 1 180 15/15
1 答案正确 1 308 2/2
2 答案正确 1 308 5/5
3 答案正确 1 308 1/1
4 答案正确 1 180 1/1
5 答案正确 464 308 3/3
6 答案正确 1 308 2/2
7 答案正确 1 308 1/1
 
#include<iostream>   
#include<vector>  
using namespace std;
long int takeIT(int start, int P)
{
  int i;
  long int sumOT = start;
  for (i = 1; i < P; i++)sumOT *= start;
  return sumOT;
}
void DFS_Factorization(vector<long int>*store, vector<long>*qq, vector<long int>*ans, int N, int K, int P,
  long int sum, int nowCnt, int startnum, int endnum)
{
  long int tempsum;
  for (; startnum <= endnum; startnum++)
  {
    tempsum = sum + (*store)[startnum - 1];
  
    if (tempsum < N&&nowCnt + 1 < K)
    {  
            (*qq).push_back(startnum);
      DFS_Factorization(store, qq, ans, N, K, P, tempsum, nowCnt + 1, startnum, endnum);
      (*qq).pop_back();
    }
    else if (tempsum == N&&nowCnt + 1 == K)
    { 
      (*ans) = (*qq);
      (*ans).push_back(startnum);
      return;
    }
    else if (tempsum >= N) 
      return; 
  }
}
int findend(vector<long int>*store, int N, int P)
{
  int i;
  for (i = 1; i <= N; i++)
  {
    (*store).push_back(takeIT(i, P));
    if ((*store)[i - 1] > N)return i - 1;
  }
  return i;
}
int main()
{
  long int N, K, P, end;
  cin >> N >> K >> P;
  vector<long int>store;
  end = findend(&store, N, P);
  vector<long int>qq;
  vector<long int>ans;
  DFS_Factorization(&store, &qq, &ans, N, K, P, 0, 0, 1, end);
  if (ans.empty())cout << "Impossible" << endl;
  else
  {
    K--;
    cout << N << " = " << ans[K] << "^" << P;
    while (K--)cout << " + " << ans[K] << "^" << P;
    cout << endl;
  }
  system("pause");
  return 0;
}

评测结果

时间 结果 得分 题目 语言 用时(ms) 内存(kB) 用户
9月12日 22:24 答案正确 30 1103 C++ (g++ 4.7.2) 618 380 datrilla

测试点

测试点 结果 用时(ms) 内存(kB) 得分/满分
0 答案正确 1 180 15/15
1 答案正确 1 332 2/2
2 答案正确 1 308 5/5
3 答案正确 1 308 1/1
4 答案正确 1 308 1/1
5 答案正确 618 380 3/3
6 答案正确 1 308 2/2
7 答案正确 1 256 1/1

#include<iostream>   
#include<vector>  
using namespace std;   
long int takeIT(int start,int P)
{
  int i;
  long int sumOT=start;
  for (i = 1; i < P; i++)sumOT *= start;
  return sumOT;
}
void DFS_Factorization(vector<long int>*store,vector<long>*qq, vector<long int>*ans, int N, int K, int P,
  long int sum, int nowCnt,int startnum,int endnum)
{
  long int tempsum;
  bool bigger = false;
  for (; startnum <= endnum&&!bigger; startnum++)
  {
    tempsum = sum + (*store)[startnum-1];
    (*qq).push_back(startnum);
    if (tempsum < N&&nowCnt + 1 < K)
      DFS_Factorization(store,qq, ans, N, K, P, tempsum, nowCnt + 1, startnum, endnum);
    else if (tempsum == N&&nowCnt + 1 == K) 
      (*ans) = (*qq); 
    else if (tempsum > N) bigger = true;
    (*qq).pop_back();
  }
}
int findend(vector<long int>*store, int N, int P)
{
  int i;
  for (i = 1; i <=N; i++)
  {
    (*store).push_back(takeIT(i, P));
    if ((*store)[i - 1] > N)return i-1;
  }
  return i;
}
int main()
{
  long int N,K,P,end;
  cin >> N >> K >> P;
  vector<long int>store;
  end = findend(&store,N, P);
  vector<long int>qq; 
  vector<long int>ans;  
  DFS_Factorization(&store,&qq, &ans, N, K, P,0,0, 1, end);
  if (ans.empty())cout << "Impossible" << endl;
  else 
  {
    K--;
    cout << N << " = " << ans[K] << "^" << P;
    while (K--)cout << " + " << ans[K] << "^" << P;
    cout << endl;
  }
  system("pause");
  return 0; 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值