UVA10825 题意很简单了- -。略
题解: 枚举最后一位数字,进行判断。判断:计算出每位数,然后进行全排列,挨个进行判断是否可行。
附上AC代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 400+10;
const int maxm = 10;
int ans[maxm];
int v[maxn];
int n, m;
bool judge(int t){
int a[maxn]={0};
int tmp=0;
for(int i =m; i>=1; --i){
tmp = tmp + ans[i]*t;
int yu=tmp%n;
if(++a[yu]>v[yu]) return false;
tmp/=n;
}
return true;
}
bool can(int last){
int tmp = 0;
memset(v, 0, sizeof(v));
for(int i =m; i>=1; --i){
tmp+=last;
tmp%=n;
++v[ans[i]=tmp];
}
sort(ans+1, ans+m);
do{
for(int i=2; i<=m; ++i){
if(!judge(i)) break;
else if(i==m) return true;
}
}while(next_permutation(ans+1, ans+m));
return false;
}
int main(){
while(scanf("%d%d", &m, &n), m||n){
bool finded = false;
for(int last=1; last<n; ++last){
if(can(last)){
finded = true;
break;
}
}
if(finded){
for(int i =1; i<=m; ++i)
printf("%d%c", ans[i], i==m?10:32);
}
else{
printf("Not found.\n");
}
}
return 0;
}