您的位置:首页 > Web前端 > AngularJS

UVA 10825 Yummy Triangular Pizza (暴力)

2016-07-05 13:32 489 查看
题目链接:

题意:

    给定M,N。要求找出一个N进制的M位数字,其乘【2,M】后,得到的结果所包含的数字集合和原有的数字集合相同,如果不存在,则输出Not found.

    题意好像没有说清楚,是否可以两位相同。而且,也没有说清楚两个数字相同位能否相同。看了网上很多博客,也都没有说明这个问题。

解题:

    思路不是自己想的,但也不复杂...

    假设末位为x,拿x*2%n,x*3%n...会得到几位数,这几位数恰好可以构成一个全排列,使用next_permutation函数可以生成全排列,检验该排列下分别乘以【2,M】是否可以在各种情况下都符合条件即可。思路并不复杂,但有一个疑点,假如开始模得的数字存在相同情况是否会有特殊。题目提及的,最多只有一个解,又意味着什么?

代码:

    不知道为啥好慢。

    #include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include <algorithm>
using namespace std;
int m,n,num[8],order[8];
bool vis[500];
int main()
{
int tmp1,tmp2,val,cnt;
while(scanf("%d%d",&m,&n))
{
bool find=0,flag=0;
if(m==0&&n==0)break;
for(int i=1;i<n;i++)
{
for(int j=0;j<m;j++)
order[j]=j;
for(int j=1;j<=m;j++)
num[j-1]=i*j%n;
while(1)
{
int c=0;
cnt=0;
for(int j=2;j<=m;j++)
{
c=0;
flag=1;
memset(vis,0,sizeof(vis));
for(int k=0;k<m;k++)
vis[num[k]]=1;
for(int k=0;k<m;k++)
{
tmp1=num[order[k]]*j+c;
c=tmp1/n;
tmp2=tmp1%n;
if(k==m-1)
tmp2=tmp1;
if(vis[tmp2])
vis[tmp2]=0;
else
{
flag=0;
break;
}
}
if(flag)
cnt++;
}
if(cnt==m-1)break;
if(next_permutation(order,order+m))
continue;
else break;
}
if(cnt==m-1)
{
val=i;
find=1;
break;
}
}
if(find)
{
printf("%d",num[order[m-1]]);
for(int i=m-2;i>=0;i--)
printf(" %d",num[order[i]]);
printf("\n");
}
else
printf("Not found.\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  uva