UVA 10825 Anagram and Multiplication(暴力枚举)

来源:互联网 发布:淘宝zara原单是真的吗 编辑:程序博客网 时间:2024/06/09 09:01

这题用next_permutation也能过,之前子集写枚举全排列,然后用暴力方法配对写崩了= =。

需要注意的只有一点,因为枚举的是最优一位,所以最后一位是固定的,枚举全排列也是枚举第前m-1位的全排列。

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=10;const int maxm=400+10;int m,n;int a[maxm],v[maxm],ans[maxn];bool check(int x,int *b){    memset(a,0,sizeof(a));    int tmp=0;    for(int i=m-1;i>=0;i--)    {        tmp=(tmp+b[i]*x);        int k=tmp%n;        a[k]++;        tmp/=n;        if(a[k]>v[k]) return false;    }    return tmp==0;}bool judge(int x){    memset(v,0,sizeof(v));    int tmp=0;    for(int i=0;i<m;i++){        tmp=(tmp+x)%n;        ans[i]=tmp;        v[tmp]++;    }    swap(ans[0],ans[m-1]);    sort(ans,ans+m-1);    do{        bool ok=true;        if(ans[0]==0) continue;        for(int i=2;i<=m;i++){            if(check(i,ans)) continue;            ok=false;break;        }        if(ok) return true;    }while(next_permutation(ans,ans+m-1));    return false;}int main(){    while(scanf("%d%d",&m,&n)&&(m+n))    {        bool ok=false;        for(int i=1;i<n;i++)        {            if(judge(i)) {ok=true;break;}        }        if(ok) for(int i=0;i<m;i++) printf("%s%d",(i==0)?"":" ",ans[i]);        else printf("Not found.");        printf("\n");    }    return 0;}

0 0