#include<bits/stdc++.h>
using namespace std;
int a[15];
int zz[15] = {0 , 1 , 2 , 4 , 7 , 6};
int check(int num , int tp){
//tp 1: 检测num是否是质数
if(tp == 1){
for(int i = 2 ; i <= sqrt(num) ; i++)if(num % i == 0)return 2;
return 1;
}
//tp 2: 检测num是否是 阶乘
if(tp == 2){
for(int i = 1 , hh = 1;hh <=num ; i++){
hh = hh * i;
if(hh == num)return 1;
}
return 2;
}
//tp 3: 检测num是否是 平方数
if(tp == 3){
int zz = sqrt(num);
if(zz * zz == num)return 1;
return 2;
}
//tp 4: 检测num是否是 立方数
if(tp == 4){
if(num == 0)return 1;
if(num == 1)return 1;
if(num == 8)return 1;
return 2;
}
//tp 5: 检测num是否是 5的倍数
if(tp == 5){
if(num % 5 == 0)return 1;
return 2;
}
return 2;
}
int dfs(int now){
if(now == 11){
//查找1===6
if(a[a[1] + 1] != 2)return 0;
for(int i = 1; i <= a[1] ; i++)if(a[i] == 2)return 0;
if(a[a[2] + 1] != a[a[2] + 2])return 0;
if(a[3] != a[zz[a[3]]])return 0;
int sum[6];
sum[1] = sum[2] = sum[3] = sum[4] = sum[5] = 0;
for(int i = 1 ; i <= 10 ; i++)if(a[i] == 1)sum[1]++;
if(sum[1] != a[4] - 1)return 0;
if(a[5] != a[11 - a[5]])return 0;
for(int i = 1 ; i <= 10 ; i++)if(a[i] == 2)sum[2]++;
for(int i = 1 ; i <= 10 ; i++)if(a[i] == 3)sum[3]++;
for(int i = 1 ; i <= 10 ; i++)if(a[i] == 4)sum[4]++;
for(int i = 1 ; i <= 10 ; i++)if(a[i] == 5)sum[5]++;
if(a[6] != 5 && sum[1] != sum[a[6] + 1] )return 0;
if(a[6] == 5)for(int i = 2 ; i <= 5 ; i++)if(sum[1] == sum[i])return 0;
if((5 - a[7]) != abs(a[7] - a[8]))return 0;
if((a[8] + 1) != sum[1] + sum[5])return 0;
if(check(sum[2] + sum[3] + sum[4] , a[9]) == 2)return 0;
for(int i = 1 ; i <= 10 ; i++){
cout<<i<<" "<<a[i]<<endl;
}
cout<<endl;
return 0;
}
for(int i = 1 ; i <= 5 ; i++){
a[now] = i;
dfs(now + 1);
}
}
int main(){
dfs(1);
}
对了,这个题引出了一个问题。。。
怎么判断一个数是不是立方数()。。。
一个比较真的做法是枚举素因子。。。
然后像线性筛一样枚举倍数
大体复杂度在
O
(
n
l
o
g
2
n
)
(
反
正
这
个
复
杂
度
是
假
的
。
。
。
可
能
没
这
么
满
)
O(nlog^2n)(反正这个复杂度是假的。。。可能没这么满)
O(nlog2n)(反正这个复杂度是假的。。。可能没这么满)