poj 3708 java版

import java.math.BigInteger;
import java.util.Scanner;
public class Main{
	public static long  gcd(long  a,long  b)
	{
		if(b==0) return a;
		return gcd(b,a%b);
	}
	public static long fmul(long a,long b,long p)
	{
		return (a*b-(long)((double)a*b/p)*p+p)%p;
	}
	public static long exgcd(long a,long b,long []x,long []y)
	{
	    if(b==0)
	    {
	        x[0]=1;
	        y[0]=0;
	        return a;
	    }
	    long g=exgcd(b,a%b,y,x);
	    y[0]=y[0]-x[0]*(a/b);
	    return g;
	}
	public static int n;
	public static long exchina(long []a,long []b)
	{
	    long m=a[1];
	    long ans=b[1];
	    long aa,bb,c,g,bg;
	    for(int i=2;i<=n;i++)
	    {
	        long []x=new long[1];
	        long []y=new long[1];
	        aa=m;
	        bb=a[i];
	        c=(b[i]-ans%bb+bb)%bb;
	        g=gcd(aa,bb);
	        if(c%g!=0) return -1;
	        bg=bb/g;
	        exgcd(aa,bb,x,y);
	        x[0]=fmul(x[0],c/g,bg);
	        ans=ans+x[0]*m;
	        m=m*bg;
	        ans=(ans%m+m)%m;
	    }
	    return (ans%m+m)%m;
	}
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		boolean flag=true;
		int d;
		int []a=new int[1005];
		int []b=new int[1005];
		BigInteger m,k;
		BigInteger dd;
		while(flag==true)
		{
			d=sc.nextInt();
			if(d==-1) break;
			for(int i=1;i<=d-1;i++)
				a[i]=sc.nextInt();
			for(int i=0;i<=d-1;i++)
				b[i]=sc.nextInt();
			m=sc.nextBigInteger();
			k=sc.nextBigInteger();
			//System.out.println(m);
			dd=BigInteger.valueOf(d);
			//System.out.println(dd);
			int []pm=new int[3000];
			int []pk=new int[3000];
			BigInteger tt;
			BigInteger zero;
			zero=BigInteger.valueOf(0);
			int cnt=0;
			int tot=0;
			while(m.compareTo(zero)>0)
			{
				tt=m.mod(dd);
				pm[++cnt]=tt.intValue();
				//System.out.println(pm[cnt]);
				m=m.divide(dd);
				//System.out.println()
			}
			//System.out.println(cnt);
			while(k.compareTo(zero)>0)
			{
				tt=k.mod(dd);
				pk[++tot]=tt.intValue();
				k=k.divide(dd);
			}
			//System.out.println(tot);
			if(cnt!=tot)
			{
				System.out.println("NO");
				continue;
			}
			long []pa=new long [5000];
			long []pb=new long[5000];
			n=tot;
			//System.out.println(n);
			int jud=0;
		     //	int []ip;
			//ip=b;
			//System.out.println(ip[1]);
			for(int i=1;i<=n;i++)
			{
				long cir=1;
				long mod=0;
				int to=pm[i];
				int []ip;
				if(i==n)ip=a;
				else ip=b;
				//System.out.println(ip[i]);
				while(ip[to]!=pm[i])
				{
					cir++;to=ip[to];
				}
				//System.out.println(cir+"*");
				int j=0;
				to=pm[i];
				while(j<=cir&&to!=pk[i])
				{
					j++;
					mod++;
					to=ip[to];
				}
				if(to!=pk[i])
				{
					System.out.println("NO");
					jud=1;
					break;
				}
				pa[i]=cir;
				pb[i]=mod;
				//System.out.println(cir+" "+mod);
			}
			if(jud==1) continue;
			long res;
			res=exchina(pa,pb);
			if(res==-1) 
				System.out.println("NO");
			else System.out.println(res);
		}
       sc.close();
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值