鍘熼鍦板潃
榪欓鐪熸槸澶鐘囦簡……鍙互璁╀漢瀹屽叏鎼炴噦鏁拌鍚屼綑閮ㄥ垎鐨勫叏閮ㄥ唴瀹?#8230;…
棰樿В……鐢變簬铏圭尗澶х宸茬粡鍦ㄧ┖闂撮噷鍐欏緱寰堣緇嗕簡錛屾墍浠ュ氨涓嶈偪涔堝啓浜嗗洤……
涓昏璇翠竴涓嬩竴浜涢毦鎯崇殑鍜屽鏄撴悶鐤電殑鍦版柟錛?br />錛?錛変腑鍥藉墿浣欏畾鐞嗙殑閭d釜鎺ㄨ錛堝涓悓浣欐柟紼嬬殑妯℃暟浜掕川錛屽垯鏁翠釜鏂圭▼緇勫湪灝忎簬鎵鏈夋ā鏁頒箣縐殑鑼冨洿鍐呯殑瑙f暟絳変簬鍚勪釜鏂圭▼瑙f暟涔嬬Н錛夊叾瀹炴槸寰堝己澶х殑錛屼笉鍏夊綰挎у悓浣欐柟紼嬫湁鐢紝瀵硅繖縐嶉潪綰挎х殑鍚屼綑鏂圭▼涔熸湁鐢紝鍙渶瑕佹墍鏈夋柟紼嬮兘婊¤凍錛氳嫢妯℃暟涓篗OD錛屽垯a鏄В褰撲笖浠呭綋(a+MOD)鏄В……鏈鏄劇劧婊¤凍錛屽洜姝わ紝鍙鍦ㄦ寜璐ㄥ洜鏁版媶鍒嗗悗姹傚嚭鍚勪釜鏂圭▼鐨勮В鏁幫紝鍐嶇浉涔樺嵆鍙紙鏈矙鑼跺氨鏄繖閲屾湪鏈夋兂璧鋒潵錛岀粨鏋滅湅浜嗚櫣鐚殑棰樿В鍥?#8230;…錛夛紱
錛?錛夊浜庝綑鏁頒笉涓?涓斿拰妯℃暟涓嶄簰璐ㄧ殑鎯呭喌瑕佺壒鍒敞鎰忥紙榪欎釜濂藉儚寰堝鏍囩▼閮界柕浜嗭紝姣斿铏圭尗緇欑殑鏍囩▼錛屼笉榪囨暟鎹急錛岃瀹冧滑榪囦簡鍥э級錛岄鍏堝繀欏繪槸浣欐暟鍚玴錛坧涓鴻鏂圭▼妯℃暟鐨勮川鍥犳暟錛夊洜瀛愮殑涓暟j鏄痑鐨勫嶆暟錛堜篃灝辨槸浣欐暟鏄痯^a鐨勫嶆暟錛夋墠鑳芥湁瑙o紝鐒跺悗錛屽綋鏈夎В鏃訛紝杞寲涓鴻В蹇呴』鏄痯^(j/a)鐨勫嶆暟浠ュ強x/(p^(j/a))婊¤凍涓涓ā鏁版寚鏁頒負鍘熸潵鎸囨暟鍑廽鐨勬柟紼嬶紝榪欓噷闇瑕佹敞鎰忥紝榪欎釜鏂版柟紼嬬殑瑙f暟涔樹互p^(j-j/a)鎵嶆槸鍘熸潵鏂圭▼鐨勮В鏁幫紒錛侀亾鐞嗗緢綆鍗曪紝鍥犱負妯℃暟闄や互浜唒^j錛岃寈鍙櫎浠ヤ簡p^(j/a)……鍙互鐢ㄤ竴緇勬暟鎹楠岋細3 330750 6643012錛岀粨鏋滄槸135鑰屼笉鏄?5錛?br />錛?錛夊師鏍瑰彧鑳芥毚鍔涙眰錛堜笉榪囨渶灝忓師鏍歸兘寰堝皬錛?000浠ュ唴鐨勬墍鏈夎川鏁版渶灝忓師鏍規渶澶у彧鏈?9……錛夛紝浣嗗湪姹傜殑鏃跺欐湁涓涓皬鐨勪紭鍖栵細棣栧厛p鐨勫師鏍逛篃鏄痯鐨勪換鎰忔暣鏁版鏂圭殑鍘熸牴錛岀劧鍚庢眰p鐨勫師鏍規椂錛屽皢(p-1)鐨勯潪鑷韓鍥犳暟錛堥鍏堟眰鍑猴級閫掑噺鎺掑簭錛岃繖鏍峰彲浠ユ瘮杈冨揩鍦版帓闄や笉鍚堟硶瑙o紱
錛?錛夋眰閫嗗厓鏃朵竴瀹氳娉ㄦ剰錛屽鏋滃緱鍒扮殑閫嗗厓鏄礋鏁幫紝瑕佽漿鍖栦負姝f暟錛屽彟澶栬鍙栨ā錛?br />錛?錛塀SGS鐨勬椂鍊欎竴瀹氳娉ㄦ剰鍘婚噸錛屽湪淇濈暀閲嶅鍏冪礌鐨勬儏鍐典笅鍗充嬌浣跨敤鍙︿竴縐嶄簩鍒嗘煡鎵句篃浼氱柕鐨勶紱
錛?錛夋暟緇勪笉瑕佸紑灝忎簡錛?br />
浠g爜錛?br />
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <algorithm>
using namespace std;
#define re(i, n) for (int i=0; i<n; i++)
#define re1(i, n) for (int i=1; i<=n; i++)
#define re2(i, l, r) for (int i=l; i<r; i++)
#define re3(i, l, r) for (int i=l; i<=r; i++)
#define rre(i, n) for (int i=n-1; i>=0; i--)
#define rre1(i, n) for (int i=n; i>0; i--)
#define rre2(i, r, l) for (int i=r-1; i>=l; i--)
#define rre3(i, r, l) for (int i=r; i>=l; i--)
#define ll long long
const int MAXN = 110, MAXP = 50010, INF = ~0U >> 2;
int P_LEN, _P[MAXP + 1], P[MAXP + 1];
int A, B, M, n, DS[MAXN], DK[MAXN], R[MAXN], KR[MAXP], res;
struct sss {
int v, No;
bool operator< (sss s0) const {return v < s0.v || v == s0.v && No < s0.No;}
} Z[MAXP];
void prepare0()
{
P_LEN = 0; int v0;
for (int i=2; i<=MAXP; i++) {
if (!_P[i]) P[P_LEN++] = _P[i] = i; v0 = _P[i] <= MAXP / i ? _P[i] : MAXP / i;
for (int j=0; j<P_LEN && P[j]<=v0; j++) _P[i * P[j]] = P[j];
}
}
void prepare()
{
n = 0; int M0 = M;
re(i, P_LEN) if (!(M0 % P[i])) {
DS[n] = P[i]; DK[n] = 1; M0 /= P[i]; while (!(M0 % P[i])) {DK[n]++; M0 /= P[i];} n++;
if (M0 == 1) break;
}
if (M0 > 1) {DS[n] = M0; DK[n++] = 1;}
int x;
re(i, n) {
x = 1; re(j, DK[i]) x *= DS[i];
R[i] = B % x;
}
}
ll pow0(ll a, int b, ll MOD)
{
if (b) {ll _ = pow0(a, b >> 1, MOD); _ = _ * _ % MOD; if (b & 1) _ = _ * a % MOD; return _;} else return 1;
}
void exgcd(int a, int b, int &x, int &y)
{
if (b) {
int _x, _y; exgcd(b, a % b, _x, _y);
x = _y; y = _x - a / b * _y;
} else {x = 1; y = 0;}
}
int gcd(int a, int b)
{
int r = 0; while (b) {r = a % b; a = b; b = r;} return a;
}
void solve()
{
int x, y; res = 1;
re(i, n) if (!R[i]) {
if (DK[i] < A) x = 1; else x = (DK[i] - 1) / A + 1;
re2(j, x, DK[i]) res *= DS[i];
} else if (!(R[i] % DS[i])) {
x = 0; while (!(R[i] % DS[i])) {R[i] /= DS[i]; x++;}
if (x % A) {res = 0; return;} else {
DK[i] -= x; y = x / A;
re2(j, y, x) res *= DS[i];
}
}
int phi, m0, m1, KR_len, _r, v0, _left, _right, _mid, T; bool FF;
re(i, n) if (R[i]) {
x = DS[i] - 1; KR_len = 0;
for (int j=2; j*j<=x; j++) if (!(x % j)) {
KR[KR_len++] = j;
if (j * j < x) KR[KR_len++] = x / j;
}
KR[KR_len++] = 1;
re2(j, 2, DS[i]) {
FF = 1;
rre(k, KR_len) {
_r = (int) pow0(j, KR[k], DS[i]);
if (_r == 1) {FF = 0; break;}
}
if (FF) {x = j; break;}
}
phi = DS[i] - 1; re2(j, 1, DK[i]) phi *= DS[i]; v0 = phi / (DS[i] - 1) * DS[i];
m0 = (int) ceil(sqrt(phi) - 1e-10);
Z[0].v = 1; Z[0].No = 0; re2(j, 1, m0) {Z[j].v = (ll) Z[j - 1].v * x % v0; Z[j].No = j;}
_r = (ll) Z[m0 - 1].v * x % v0; sort(Z, Z + m0);
m1 = 1; re2(j, 1, m0) if (Z[j].v > Z[j - 1].v) Z[m1++] = Z[j];
exgcd(_r, v0, x, y); if (x < 0) x += v0; y = R[i];
re(j, m0) {
_left = 0; _right = m1 - 1; T = -1;
while (_left <= _right) {
_mid = _left + _right >> 1;
if (y == Z[_mid].v) {T = j * m0 + Z[_mid].No; break;}
else if (y < Z[_mid].v) _right = _mid - 1; else _left = _mid + 1;
}
if (T >= 0) break; else y = (ll) y * x % v0;
}
x = gcd(A, phi); if (T % x) {res = 0; break;} else res *= x;
}
}
int main()
{
int tests;
scanf("%d", &tests);
prepare0();
re(testno, tests) {
scanf("%d%d%d", &A, &B, &M); M += M + 1; B %= M;
if (!A) {
if (B == 1) res = M; else res = 0;
} else {
prepare();
solve();
}
printf("%d\n", res);
}
return 0;
}

]]>