凑平方数
今天看到一个题目,感觉挺好玩的,做了一下。
题目
凑平方数
把0~9这10个数字,分成多个组,每个组恰好是一个平方数,这是能够办到的。
比如:0, 36, 5948721
再比如:
1098524736
1, 25, 6390784
0, 4, 289, 15376
等等…
注意,0可以作为独立的数字,但不能作为多位数字的开始。
选自第七届蓝桥杯B组第二题(填空题)
好像先预处理,在进行暴力搜索没啥问题,重点是long long int 真坑,调试了半天
预处理:筛选出1-\(\sqrt {9876543210}\)的所有平方数,注意这里还可以更加细节的筛,考虑0-9这10个数字都不一样,可以在预处理中将重复的删除比如\(\sqrt{100}=10\),这个数就不行,怎么凑都不可能凑到完全不一样的数
DFS:暴力枚举各种可能性 好吧我不会表述
set:set是用来判重的,反正重复丢到set里去也没有的,可以用hashset,然后统计下数字就出来惹,答案是300。
付下代码
#include<bits/stdc++.h>
using namespace std;
const int MAXV = 100001;
long long int nums[MAXV];
int books[10];
int cut;
void make_1(long long int);
int Part_1(int);
int init(long long int x)
{
int cut = 0;
for (long long int i = 0; i <= sqrt(x); i++)
{
int flag = 1;
memset(books, 0, sizeof books);
long long int k = i * i;
make_1(k);
for(int i=0;i<10;i++)
if (books[i] > 1)
{
flag = 0;
break;
}
if(flag==0)
continue;
nums[cut++] =k;
}
return cut;
}
void make_1(long long int x)
{
do
{
int k = x % 10;
books[k]++;
x = x / 10;
} while (x);
}
void make_0(long long int x)
{
do
{
int k = x % 10;
books[k]--;
x = x / 10;
} while (x);
}
int total_1(int books[10])
{
int i = 0;
while (books[i] == 1)
i++;
if (i == 10)
return 1;
return 0;
}
int Part_1(int x)
{
do
{
int k = x % 10;
if (books[k] > 1)
return 1;
x = x / 10;
} while (x);
return 0;
}
int mynum = 0;
vector<long long int>result(10);
set<long long int>xx;
set<set<long long int> >yy;
void dfs(int k)
{
for (int i = 0; i < 10; i++)
if (books[i] > 1)
return;
if (total_1(books) == 1)
{
xx.clear();
for (int i = 0; i < k; i++)
xx.insert(result[i]);
/*打印看看*/
/*
for (auto iter = xx.begin(); iter != xx.end(); ++iter)
cout << *iter << " ";
cout << endl;
*/
yy.insert(xx);
return;
}
for (int i=0; i < cut; ++i)
{
make_1(nums[i]);
result[k]=nums[i];
dfs(k+1);
make_0(nums[i]);
}
}
int main()
{
cut=init(9876543210);
//看看预处理对不对
/*
for (int i = 0; i < cut; i++)
cout << nums[i] << " ";
cout << endl;
*/
//预处理后要清0一下
memset(books, 0, sizeof books);
dfs(0);
cout << yy.size();
}
还有,高数好难,不会写,哭了
现在很菜,以后更菜

浙公网安备 33010602011771号