Japan Alumni Group Summer Camp 2013 Warming Up

Submission #828517

Source codeソースコード

#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <cstring>
#include <cassert>
#define SIZE 100005

using namespace std;
typedef long long int ll;

int to[SIZE];
bool use[SIZE];
int cnt[SIZE];
int ans[SIZE],ret[SIZE];
int nd[SIZE];

int main()
{
	int n;
	ll K;
	scanf("%d %lld",&n,&K);
	for(int i=0;i<n;i++)
	{
		scanf("%d",&to[i]);
		to[i]--;
	}
	if(K==1)
	{
		for(int i=0;i<n;i++)
		{
			if(i!=0) printf(" ");
			printf("%d",to[i]+1);
		}puts("");
		return 0;
	}
	for(int i=0;i<n;i++)
	{
		if(!use[i])
		{
			int now=i;
			int len=0;
			do
			{
				use[now]=true;
				len++;
				now=to[now];
			}while(now!=i);
			cnt[len]++;
		}
	}
	bool up=true;
	int sum=0;
	for(int i=1;i<=n;i++)
	{
		if(cnt[i]>0)
		{
			sum+=cnt[i]*i;
			ll t=1,zan=K;
			int s=i;
			for(int j=2;j*j<=s;j++)
			{
				if(s%j==0)
				{
					while(s%j==0) s/=j;
					while(zan%j==0)
					{
						zan/=j;
						t*=(ll) j;
					}
				}
			}
			if(s!=1)
			{
				while(zan%s==0)
				{
					zan/=s;
					t*=(ll) s;
				}
			}
			//printf("%d %lld : %d\n",i,t,cnt[i]);
			if(cnt[i]%t!=0)
			{
				puts("Impossible");
				return 0;
			}
			if(cnt[i]>=2) up=false;
		}
	}
	assert(sum==n);
	if(!up)
	{
		puts("Ambiguous");
		return 0;
	}
	//全部一種類からなるcycle
	memset(use,false,sizeof(use));
	for(int i=0;i<n;i++)
	{
		if(!use[i])
		{
			int now=i;
			int L=0;
			do
			{
				use[now]=true;
				nd[L++]=now;
				now=to[now];
			}while(now!=i);
			int z=(int) (K%L);
			
			int k=0;
			while((ll) z*(ll) k%L!=1) k++;
			//ans[i]=to^k[i]=nd[pos[i]+k] -> ans[nd[i]]=nd[i+k]
			for(int j=0;j<L;j++) ans[nd[j]]=nd[(j+k)%L];
		}
	}
	//for(int i=0;i<n;i++) printf("%d ",ans[i]);puts("");
	//for(int i=0;i<n;i++) ret[ans[i]]=i;
	for(int i=0;i<n;i++)
	{
		if(i!=0) printf(" ");
		printf("%d",ans[i]+1);
	}puts("");
	return 0;
}

Submission

Task問題 H - Shuffling Machine
User nameユーザ名 yutaka1999
Created time投稿日時
Language言語 C++ (GCC 4.4.7)
Status状態 WA
Score得点 0
Source lengthソースコード長 1956 Byte
File nameファイル名
Exec time実行時間 ms
Memory usageメモリ使用量 -

Compiler messageコンパイルメッセージ

./Main.cpp: In function ‘int main()’:
./Main.cpp:22: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result
./Main.cpp:25: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result

Test case

Set

Set name Score得点 / Max score Cases
All 0 / 100 1,10,11,12,13,14,15,16,17,18,19,2,20,21,22,23,24,25,26,27,28,29,3,30,31,32,33,34,35,36,37,38,39,4,40,41,42,43,44,45,46,47,48,5,6,7,8,9

Test case

Case name Status状態 Exec time実行時間 Memory usageメモリ使用量
1 AC 28 ms 956 KB
10 AC 27 ms 812 KB
11 AC 37 ms 1128 KB
12 AC 27 ms 872 KB
13 AC 39 ms 1132 KB
14 AC 45 ms 1264 KB
15 AC 74 ms 2024 KB
16 AC 45 ms 1268 KB
17 AC 48 ms 1264 KB
18 AC 47 ms 1252 KB
19 WA
2 AC 26 ms 788 KB
20 WA
21 AC 47 ms 1268 KB
22 WA
23 AC 49 ms 1320 KB
24 AC 47 ms 1260 KB
25 TLE
26 AC 48 ms 1256 KB
27 AC 48 ms 1260 KB
28 WA
29 AC 48 ms 1256 KB
3 AC 27 ms 748 KB
30 AC 47 ms 1352 KB
31 WA
32 AC 47 ms 1352 KB
33 AC 50 ms 1288 KB
34 AC 47 ms 1260 KB
35 AC 27 ms 920 KB
36 AC 28 ms 876 KB
37 AC 26 ms 1048 KB
38 AC 28 ms 924 KB
39 AC 25 ms 928 KB
4 AC 30 ms 792 KB
40 AC 30 ms 924 KB
41 AC 29 ms 800 KB
42 AC 27 ms 876 KB
43 AC 30 ms 800 KB
44 AC 27 ms 916 KB
45 TLE
46 TLE
47 TLE
48 TLE
5 AC 27 ms 856 KB
6 AC 26 ms 800 KB
7 AC 31 ms 924 KB
8 TLE
9 TLE