您的位置:首页 > 其它

uva10825 (暴力)

2016-03-17 19:21 405 查看
题目大意:

给出m位n进制的数,要求它乘以2~m,求是否存在这样的数,乘以2~m之后得到的数是原来的数组成的数字。

思路:

搞了快一小时。。唉。

首先,由于是乘以2~m后都要是原来的数字所组成的,所以假如最后一位是a,那么里面必定存在一位是(2*a)%n 也必定存在一个数属于2~m 乘以a对n求余存在于这m位数当中。

枚举最后一位数,最后一位数肯定位于1~n-1 因为肯定不能超过进制数,也不可能是0 如果是0的话 那么肯定不可能存在这么一串数字。

代码:

#include <iostream>
using namespace std;
#include <cstring>
#include <stdio.h>
#include <algorithm>

int num[7];
int vis[7];
int order[7];
int n,m;

bool solve(int x) {
for(int i = 2; i <= m; i++)
order[i] = i;
do {
bool flag2 = true;
for(int i = 2; i <= m; i++) {
memset(vis,0,sizeof(vis));
vis[i] = 1;
int c = x * i / n;
for(int j = 2; j <= m; j++) {
int temp = (num[order[j]] * i + c) % n;
c = (num[order[j]] * i + c) /n;
bool flag = false;
for(int k = 1; k <= m; k++) {
if(temp == num[k] && !vis[k]) {
vis[k] = 1;
flag = true;
break;
}
}
if(!flag) {
flag2 = false;
break;
}
}
if(!flag2)
break;
}
if(flag2)
return true;
}while(next_permutation(order + 2, order + m + 1));
return false;
}
int main() {
while(scanf("%d %d",&m,&n) && m) {
bool flag = false;
for(int i = 1;i < n; i++) {
for(int j = 1; j <= m; j++) {
num[j] = (i * j) % n;//i是枚举的最后一位 num记录的是数字中的每一位
}
if(solve(i)) {
flag = true;
for(int j = m; j >= 2; j--)
printf("%d ",num[order[j]]);
printf("%d\n",i);
break;
}
}
if(!flag)
printf("Not found.\n");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: