Mathematical Problem 题解

给定奇数 𝑛,求出 𝑛*个正整数满足:

  • 都是完全平方数。
  • 长度为 𝑛 且没有前导 0。
  • 组成这 𝑛 个数的数字([0,9] 内数字)组成的可重集相同。

输出任意一种方案。

输入格式

输入

第一行包含一个整数 𝑡 ( 1≤𝑡≤100 ) - 测试用例的数量。

接下来的 𝑡t 行包含一个整数 𝑛 ( 1≤𝑛≤99 ) - 需要查找的数字个数及其长度。

保证在给定的限制条件下存在解决方案。

保证 𝑛^2 的总和不超过 10^5

数字可以任意顺序输出。

输出格式

输出

对于每个测试用例,您需要输出长度为 𝑛n 的 𝑛n 个数字。

如果有多个答案,则打印其中任意一个。

样例
Input 1
3
1
3
5
Output 1
1
169
196
961
16384
31684
36481
38416
43681

思路

先写一个暴力代码直接枚举,结果发现在 n=5 时,除题目给的这组以外,还有一组与 n=3 时很像:

16900/19600/96100/10609/90601

同时,在 n=7 时也有这样一组:

1690000/1960000/9610000/1060900/9060100/1006009/9006001

这里的规律就很明显了:

以169,961为基础,在相邻两数之间插入相同个数的0,并在末尾补0补齐数位。

再考虑196——直接在末尾加0。

为了不被删代码,就给出一部分啦(QWQ)


            for(int i=0;i<=(n-3)/2;i++){
                printf("1");
                j=i;
                while(j--)printf("0");
                printf("6");
                j=i;
                while(j--)printf("0");
                printf("9");
                int k=n-2*i-3;
                while(k--)printf("0");
                printf(" ");
            }
            for(int i=0;i<=(n-3)/2;i++){
                printf("9");
                j=i;
                while(j--)printf("0");
                printf("6");
                j=i;
                while(j--)printf("0");
                printf("1");
                int k=n-2*i-3;
                while(k--)printf("0");
                printf(" ");
            }
            printf("196");
            for(int i=0;i<n-3;i++)printf("0");