| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
求救,本想偷懒,现在不断完善,真不知道哪里有问题了,大牛们,帮忙瞄下#include<iostream>
/*
这里用了计算各个祭祀的周期,求最小公倍数
*/
using namespace std;
int d[201][201];
int flag[201][201];
int ds[201];
__int64 gcd(__int64 a,__int64 b)
{
__int64 r=0;
while(b!=0) {
r=a%b;
a=b;
b=r;
}
return a;
}
__int64 gcds(int *t,int n)
{
__int64 re=t[0];
for(int i=1;i<n;i++) {
re=gcd(re,t[i]);
}
return re;
}
__int64 comm_mul(__int64 a,__int64 b)
{
return a/gcd(a,b)*b;
}
__int64 min_mul(int *t,int n)
{
__int64 gcdd=gcds(ds,n);//公共最大公约数
__int64 re=t[0];
for(int i=1;i<n;i++) {
re=comm_mul(re,t[i]);
}
return re;
}
__int64 solve(int n,int p)
{
__int64 re=0;
int x,y;
bool is_valid=true;
for(int i=0;i<n&&is_valid;i++) {
re=0;
//x=i;y=0;
x=d[i][0]-1;
y=1;
bool f=false;
for(int t=0;t<p;t++) {
if(d[i][t]!=i+1)
{
f=true;
break;
}
}
if(f) {
memset(flag,0,sizeof(flag));
while((x!=i||y!=0)&&!flag[x][y]) {
flag[x][y]=true;
x=d[x][y]-1;
y=(++y)%p;
re++;
}
//cout<<re+1<<"\t";
if(x==i&&y==0) {
ds[i]=re+1;
}
else
{
is_valid=false;
}
}
else
{
ds[i]=1;
}
}
//cout<<endl;
if(is_valid) {
return min_mul(ds,n);
}
else
{
return 0;
}
}
int main()
{
int n,p;
while(cin>>n>>p)
{
memset(d,0,sizeof(d));
memset(ds,0,sizeof(ds));
for(int i=0;i<n;i++) {
for(int j=0;j<p;j++) {
scanf("%d",&d[i][j]);
}
}
__int64 re=solve(n,p);
if(re>0) {
cout<<re<<endl;
}
else
{
cout<<"No one knows."<<endl;
}
}
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator