题目大意
给定一个 a 和一个奇质数 p(1≤a<p),令 bx=axmodp, x=1,2,⋯,p−1,则 b 序列形成一个 1 到 p−1 的排列,求这个排列的逆序对数量 mod2。
p≤1018
多测,T≤105
1s
题解
排列 b1,⋯,bn 的逆序对数量的奇偶性用这个式子表示,奇数就得到 −1,偶数就得到 1:
sign=∏1≤j<i≤ni−j∏1≤j<i≤nbi−bj
这是因为,分子的 (bj,bi) 如果是正序对,那么会跟分母的 bi−bj 约掉;如果是逆序对,那么跟分母约掉之后还会多出一个 −1。
式子代入这题:
sign=∏1≤j<i<pi−j∏1≤j<i<pbi−bj≡∏1≤j<i<pi−j∏1≤j<i<pai−aj≡a2(p−1)(p−2)≡(a2p−1)−1(modp)
所以就只需判断 a2p−1 是 1 还是 −1。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| #include<bits/stdc++.h> #define fo(i,a,b) for(int i=a;i<=b;i++) using namespace std;
typedef long long LL;
LL mul(LL a,LL b,LL n) {return(a*b-(LL)(a/(long double)n*b+1e-3)*n+n)%n;}
LL Pow(LL x,LL y,LL mo) { LL re=1; for(; y; y>>=1, x=mul(x,x,mo)) if (y&1) re=mul(re,x,mo); return re; }
int main() { int T; scanf("%d",&T); while (T--) { LL a,p; scanf("%lld %lld",&a,&p); printf("%d\n",(Pow(a,(p-1)>>1,p)&1)^1); } }
|