Description
Input
Output
Sample Input
Sample Output
#include<bits/stdc++.h> using namespace std; typedef long long ll ; ll a , b ; int main () { int T ; scanf ("%d" , &T ) ; for (int cas = 1 ; cas <= T ; cas ++) { scanf ("%I64d%I64d" , &a , &b) ; ll g = __gcd (a,b) ; if (g == 1) { printf ("Case #%d: NO\n" , cas) ; continue ; } a/= g ; ll flag = __gcd (a , g) ; while (flag != 1) { while (a % flag == 0) a/=flag ; flag = __gcd (a , g) ; } if (a == 1 ) printf ("Case #%d: YES\n" , cas) ; else printf ("Case #%d: NO\n" , cas) ; } return 0 ; }
其实用O(sqrt(n))的方法也是可以的,但姿势不好看很容易tle。
用log(n)的方法理解上也很容易,先求g = gcd(a , b) ,那么显然若 {a的质因子 } 属于 {g的质因子} , a^k % b 一定等于0 ------no.1
所以之后不断求 flag = gcd (g , a) , 并让 a /= flag ;
最终a 和 g互质时,若a != 1 , 则no.1肯定不成立,那么肯定不存在k,能让所求等式成立,
反之a = 1的情况,就肯定成立了。
2012多校3.A(用O(log(n))判断b^k % a == 0)
原文:http://www.cnblogs.com/get-an-AC-everyday/p/4758713.html