给定奇数 𝑛,求出 𝑛*个正整数满足:
- 都是完全平方数。
- 长度为 𝑛 且没有前导 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");