说明
用0至9这10个数字组成一位数、两位数、三位数、四位数各一个,使它们都是非零的完全平方数.例如1,36,784,9025就是满足条件的一种分法
输出格式
输出有多少种方案
题解
我们可以自己造出完全平方数,怎么造呢?例如3,用它自己乘它自己,就是9,就造出来一个完全平方数了(优势:可以省时间复杂度)。
然后我们就可以分类讨论四种情况:
step 1:一位数
一位数的范围是0~9,注意题目说“它们都是非零的完全平方数”,所以我们枚举时就只要枚举1~3就行了(0*0=0)。
step 2:两位数
两位数的范围是10~99,只要枚举4~9就行了。
step 3:三位数
三位数的范围是100~999,只要枚举10~31就行。
step 4:四位数
四位数的范围是1000~9999,只要枚举32~99。
枚举完之后,我们依次将这四个数乘它自己,就得到四个完全平方数,将四个完全平方数数位拆分后判断是不是都是0~9这几个不重复的数字组成的,如果是,就ans++。
————————————————
版权声明:上文有CSDN博主「zealous_zzx」的原创文章改编而来,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/MLJYHP/article/details/128678787
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int vis[10001],ans;
void f(int x)
{
while(x)
{
vis[x % 10]++;
x /= 10;
}
}
signed main()
{
for(int i = 1; i <= 3; i++)
for(int j = 4; j <= 9; j++)
for(int k = 10; k <= 31; k++)
for(int l = 32; l <= 99; l++)
{
bool fl = 1;
int a = i * i,b = j * j,c = k * k,d = l * l;
f(a);
f(b);
f(c);
f(d);
for(int p = 0; p <= 9; p++)
{
if(vis[p] == 0)
{
fl = 0;
break;
}
}
if(fl == 1) ans++;
memset(vis,0,sizeof(vis));
}
cout<<ans;
return 0;
}