回転数をトレーニングするBlue Bridge CupアルゴリズムのJava実装(暴力的)

回転数をトレーニングするテストアルゴリズム

リソース制限
時間制限:1.0秒メモリ制限:256.0MB
問題の説明
  自転車は数学が大好きな賢い子供です。彼は142857に触発された「回転可能な数」を発明しました。
  ご覧のように、142857は非常に不思議な数値です。これは、回転によって得られたすべての数値が1,2,3 ...、6(1から数値までの長さ)で乗算されるためです。数値を回転させるとは、数値の最後の桁を前に置くことです。たとえば、12345を回転させると、12345、51234、45123、34512、23351の数値を取得できます。ここでは先行ゼロが許可されていることに言及する価値があります。したがって、0012345を回転させることにより、4500123および0123450を取得できます。142857が条件を満たしている理由がわかります。以下の6つの式が小数で確立されている:
  142857 * 1 = 142857;
  142857×2 = 285714;
  142857×3 = 428571;
  142857 * 4 = 571428;
  142857 * 5 = 714285;
  * 6 = 857142 142857
  今は、自転車が提案しました問題が発生しました。彼は「回転可能な数」を任意の底に拡張した。上記のように、142857は10進数の「回転可能な数値」です。別の例は、バイナリの0011です。次の4つの方程式はすべてバイナリで保持されます:
  0011 * 1 = 0011;
  0011 * 10 = 0110;
  0011 * 11 = 1001;
  0011 * 100 = 1100
  彼は最大のb(1 <b <x)を見つけようとしています。これは、bシステムで長さnの正の「回転可能数」の存在を満たします(先行ゼロは許可されます)。
入力フォーマット
  1行のみに、スペースで区切られた2つの整数n、xが含まれます。
出力形式
  検出された最大のbを示す、1行の整数。条件を満たすbがない場合は-1を出力します。
サンプル入力I
  6 11
サンプル出力I
  10
サンプル入力II
  5 8
サンプル出力II
  -1
データサイズと規則
  データの20%の場合、n <= 10、x <= 15
  データの50%の場合、x < = 10
  データの100%の場合、1 <= n <= 5 * 10 ^ 6、2 <= x <= 10 ^ 9

 
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		// 转自:	https://blog.csdn.net/a1439775520   
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int x = sc.nextInt();
		sc.close();
		if (n==1&&x==3) {
			System.out.println(2);
			return;
		}
		if (!isPrime(n + 1)) {
			System.out.println(-1);
			return;
		}
		for (int i = x - 1; i >1; i--) {
			if (isRoot(i, n + 1)) {
				System.out.println(i);
				return;
			}
		}
		System.out.println(-1);
	}

	private static boolean isRoot(long a, long p) {
		if (a%p==0) {
			return false;
		}
		for (int i = 1; i * i <= p - 1; i++) {
			if ((p - 1) % i == 0) {
				if (i < p - 1 && ex(a, i, p) == 1) {
					return false;
				}
				if ((p - 1) / i < p - 1 && ex(a, (p - 1) / i, p) == 1) {
					return false;
				}
			}
		}
		return true;
	}

	private static long ex(long a, long n, long p) {
		if (n == 0) {
			return 1 % p;
		}
		long res = 1;
		while (n != 0) {
			if ((n & 1) == 1) {
				res = res * a % p;
			}
			n >>= 1;
			a = a * a % p;
		}
		return res;
	}

	private static boolean isPrime(long n) {
		for (int i = 2; i * i <= n; i++) {
			if (n % i == 0) {
				return false;
			}
		}
		return true;
	}

}

リリース1794元の記事 ウォンの賞賛30000 + ビュー449万+

おすすめ

転載: blog.csdn.net/a1439775520/article/details/105488593