1103. Integer Factorization (30)
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 2Sample Output 1:
169 = 6^2 + 6^2 + 6^2 + 6^2 + 5^2Sample Input 2:
169 167 3Sample 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; }