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;
}
题意:
给定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;
}
相关文章推荐
- 1.10055 - Hashmat the brave warrior
- 2.10071 - Back to High School Physics
- 3.458 - The Decoder
- 4.694 - The Collatz Sequence
- 6.494 - Kindergarten Counting Game
- 7.490 - Rotating Sentences
- 8.414 - Machined Surfaces
- 9.488 - Triangle Wave
- A.457 - Linear Cellular Automata
- B.489 - Hangman Judge
- C.445 - Marvelous Mazes
- 1.10494 - If We Were a Child Again
- 2.424 - Integer Inquiry
- 3.10250 - The Other Two Trees
- 5.465 - Overflow
- 6.113 - Power of Cryptography
- 7.10161 - Ant on a Chessboard
- 8.621 - Secret Research
- 9.401 - Palindromes
- A.537 - Artificial Intelligence?