URAL 1658. Sum of Digits(简单dp)

来源:互联网 发布:java jar 资源文件 编辑:程序博客网 时间:2024/04/29 05:43

给你n,m。然后输出100位以内一个数字,每一位的和为n,每一位的平方和为m。

以n,m为dp[i][j]。pre[i][j]记录位置上的数字。

1658. Sum of Digits

Time limit: 2.0 second
Memory limit: 64 MB
Petka thought of a positive integer n and reported to Chapaev the sum of its digits and the sum of its squared digits. Chapaev scratched his head and said: “Well, Petka, I won't find just your number, but I can find the smallest fitting number.” Can you do the same?

Input

The first line contains the number of test cases t (no more than 10000). In each of the following tlines there are numbers s1 and s2 (1 ≤ s1s2 ≤ 10000) separated by a space. They are the sum of digits and the sum of squared digits of the number n.

Output

For each test case, output in a separate line the smallest fitting number n, or “No solution” if there is no such number or if it contains more than 100 digits.

Sample

inputoutput
49 8112 96 107 9
9No solution1122111112
#include <algorithm>#include <iostream>#include <stdlib.h>#include <string.h>#include <iomanip>#include <stdio.h>#include <string>#include <queue>#include <cmath>#include <stack>#include <map>#include <set>#define eps 1e-8#define M 1000100#define LL __int64///#define LL long long#define INF 0x3f3f3ff#define PI 3.1415926535898#define MOD 1000000009const int maxn = 10100;using namespace std;int dp[910][8110];int pre[910][8110];void Pre(){    for(int i = 0; i <= 900; i++)        for(int j = 0; j <= 8100; j++)            dp[i][j] = 101;    dp[0][0] = 0;    for(int i = 1; i <= 900; i++)    {        for(int j = 1; j <= 8100; j++)        {            for(int k = 1; k<=9&&k<=i&&k*k<=j; k++)            {                if(i-k > j-k*k)                    break;                if(dp[i][j] > dp[i-k][j-k*k]+1)                {                    dp[i][j] = dp[i-k][j-k*k]+1;                    pre[i][j] = k;                }            }        }    }}int main(){    Pre();    int n, m;    int T;    cin >>T;    while(T--)    {        scanf("%d %d",&n, &m);        if(n>m ||  n > 900 || m > 8100 || dp[n][m] > 100 )        {            cout<<"No solution"<<endl;            continue;        }        int t;        while(n&&m)        {            t = pre[n][m];            printf("%d",t);            n -= t;            m -= t*t;        }        cout<<endl;    }    return 0;}


0 0
原创粉丝点击