uva10825 (暴力)

来源:互联网 发布:java变量怎么初始化 编辑:程序博客网 时间:2024/06/11 18:29

题目大意:
给出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");    }}
0 0
原创粉丝点击