题目
https://gmoj.net/senior/#main/show/6844
前言
这道题居然在题面中给出了结论(如果不给结论,该是T4难度的吧)
本来是不打算写题解的,但是由于这题给出的结论的证明很有价值,我就写下来吧。
SLS大佬太强啦%%%
题解
考场上原本是没什么思路的。但是我看到了这句话:
而上表说3,4,5,6保证a和b都是奇数。
我们可以先把a和b都写成
2
x
y
2^xy
2xy的形式,使得它们中至少有一个变成了奇数。接下来分类讨论:
- 当a和b都是奇数时,根据题目给出的结论,可以只存下
a
n
a^n
an和
b
n
b^n
bn最后的63个二进制位。因此用
unsigned long long
搞快速幂就好了; - 当a和b一奇一偶时, lowbit ( a n − b n ) \operatorname{lowbit}(a^n-b^n) lowbit(an−bn)显然是1。
最后把 lowbit \operatorname{lowbit} lowbit的结果乘上 2 n x 2^{nx} 2nx就好了。
结论
当
a
,
b
a,b
a,b为奇数时,有
lowbit
(
a
n
−
b
n
)
=
{
lowbit
(
a
−
b
)
,
2
∤
n
lowbit
(
a
−
b
)
⋅
lowbit
(
a
+
b
)
⋅
lowbit
(
n
2
)
,
2
∣
n
\operatorname{lowbit}{\left(a^n-b^n\right)}=\begin{cases}\operatorname{lowbit}{(a-b)},&2\nmid n\\[2ex] \operatorname{lowbit}{(a-b)}\cdot \operatorname{lowbit}{(a+b)}\cdot \operatorname{lowbit}{\left(\frac{n}{2}\right)},& 2\mid n\end{cases}
lowbit(an−bn)=⎩⎨⎧lowbit(a−b),lowbit(a−b)⋅lowbit(a+b)⋅lowbit(2n),2∤n2∣n
由于
a
,
b
,
n
a,b,n
a,b,n最大都只是
1
0
6
10^6
106,因此
lowbit
(
a
n
−
b
n
)
\operatorname{lowbit}{(a^n-b^n)}
lowbit(an−bn)是long long
存得下的。
证明
先构造三个引理:
引理1:
∀
a
,
b
∈
N
,
lowbit
(
a
b
)
=
lowbit
(
a
)
⋅
lowbit
(
b
)
\forall a,b\in N,\operatorname{lowbit}{(ab)}=\operatorname{lowbit}{(a)}\cdot \operatorname{lowbit}{(b)}
∀a,b∈N,lowbit(ab)=lowbit(a)⋅lowbit(b)
证明:
令
a
=
2
x
1
x
2
,
b
=
2
y
1
y
2
a=2^{x_1}x_2,b=2^{y1}y2
a=2x1x2,b=2y1y2,其中
x
2
,
y
2
x_2,y_2
x2,y2都是奇数。
那么
lowbit
(
a
b
)
=
lowbit
(
2
x
1
x
2
⋅
2
y
1
y
2
)
=
lowbit
(
2
x
1
+
y
1
⋅
x
2
⋅
y
2
)
=
2
x
1
+
y
1
=
lowbit
(
a
)
⋅
lowbit
(
b
)
\begin{aligned} \operatorname{lowbit}{(ab)} &= \operatorname{lowbit}{(2^{x_1}x_2\cdot 2^{y1}y2)}\\ &=\operatorname{lowbit}{(2^{x_1+y_1}\cdot x_2\cdot y_2)}\\ &=2^{x_1+y_1}=\operatorname{lowbit}{(a)}\cdot \operatorname{lowbit}{(b)} \end{aligned}
lowbit(ab)=lowbit(2x1x2⋅2y1y2)=lowbit(2x1+y1⋅x2⋅y2)=2x1+y1=lowbit(a)⋅lowbit(b)
得证。
引理2:当n是奇数时,
lowbit
(
a
n
−
b
n
)
=
lowbit
(
a
−
b
)
\operatorname{lowbit}{(a^n-b^n)}=\operatorname{lowbit}{(a-b)}
lowbit(an−bn)=lowbit(a−b)。
证明:
lowbit
(
a
n
−
b
n
)
=
lowbit
(
(
a
−
b
)
∑
i
=
0
n
−
1
a
i
⋅
b
n
−
1
−
i
)
\operatorname{lowbit}{(a^n-b^n)}=\operatorname{lowbit}{\left((a-b)\sum_{i=0}^{n-1} a^i\cdot b^{n-1-i}\right)}
lowbit(an−bn)=lowbit((a−b)i=0∑n−1ai⋅bn−1−i)
那么现在要证明:
∑
i
=
0
n
−
1
a
i
⋅
b
n
−
1
−
i
≡
1
(
m
o
d
2
)
\sum_{i=0}^{n-1} a^i\cdot b^{n-1-i}\equiv 1\pmod{2}
i=0∑n−1ai⋅bn−1−i≡1(mod2)
因为
a
,
b
a,b
a,b都是奇数,因此
a
i
,
b
n
−
1
−
i
a^i,b^{n-1-i}
ai,bn−1−i是奇数,
a
i
⋅
b
n
−
1
−
i
≡
1
(
m
o
d
2
)
a^i\cdot b^{n-1-i}\equiv 1\pmod{2}
ai⋅bn−1−i≡1(mod2)。又因为有
n
n
n项,因此
∑
i
=
0
n
−
1
a
i
⋅
b
n
−
1
−
i
≡
1
(
m
o
d
2
)
\sum_{i=0}^{n-1} a^i\cdot b^{n-1-i}\equiv 1\pmod{2}
∑i=0n−1ai⋅bn−1−i≡1(mod2)。
得证。
引理3:当
a
,
b
a,b
a,b是奇数时,
lowbit
(
a
2
+
b
2
)
=
2
\operatorname{lowbit}{(a^2+b^2)}=2
lowbit(a2+b2)=2。
证明:
分类讨论
a
,
b
a,b
a,b在二进制下的后两位:
- 当 a a a的后两位是01, b b b的后两位是01时, a 2 , b 2 a^2,b^2 a2,b2的后两位都是01,得证;
- 当 a a a的后两位是01, b b b的后两位是11时, a 2 , b 2 a^2,b^2 a2,b2的后两位都是01,得证;
- 当 a a a的后两位是11, b b b的后两位是01时, a 2 , b 2 a^2,b^2 a2,b2的后两位都是01,得证;
- 当 a a a的后两位是11, b b b的后两位是11时, a 2 , b 2 a^2,b^2 a2,b2的后两位都是01,得证;
引理4:当
a
,
b
a,b
a,b是奇数,
lowbit
(
a
2
x
−
b
2
x
)
=
lowbit
(
a
−
b
)
⋅
lowbit
(
a
+
b
)
⋅
2
x
−
1
\operatorname{lowbit}{\left(a^{2^x}-b^{2^x}\right)}=\operatorname{lowbit}{(a-b)}\cdot \operatorname{lowbit}{(a+b)}\cdot 2^{x-1}
lowbit(a2x−b2x)=lowbit(a−b)⋅lowbit(a+b)⋅2x−1
证明:
令
t
=
x
−
1
,
p
=
a
2
,
q
=
b
2
t=x-1,p=a^2,q=b^2
t=x−1,p=a2,q=b2,则要证
lowbit
(
p
2
x
−
1
−
q
2
x
−
1
)
=
lowbit
(
p
−
q
)
⋅
2
x
−
1
lowbit
(
p
2
t
−
q
2
t
)
=
lowbit
(
p
−
q
)
⋅
2
t
\begin{aligned} \operatorname{lowbit}{\left(p^{2^{x-1}}-q^{2^{x-1}}\right)}&=\operatorname{lowbit}{(p-q)}\cdot 2^{x-1}\\ \operatorname{lowbit}{\left(p^{2^t}-q^{2^t}\right)}&=\operatorname{lowbit}{(p-q)}\cdot 2^t \end{aligned}
lowbit(p2x−1−q2x−1)lowbit(p2t−q2t)=lowbit(p−q)⋅2x−1=lowbit(p−q)⋅2t
当
t
=
1
t=1
t=1时,
lowbit
(
p
2
−
q
2
)
=
lowbit
(
p
−
q
)
⋅
lowbit
(
p
+
q
)
\operatorname{lowbit}{(p^2-q^2)}=\operatorname{lowbit}{(p-q)}\cdot \operatorname{lowbit}{(p+q)}
lowbit(p2−q2)=lowbit(p−q)⋅lowbit(p+q)。由引理3可得
lowbit
(
p
+
q
)
=
2
\operatorname{lowbit}{(p+q)}=2
lowbit(p+q)=2,因此等式成立。
在等式两边同时乘上
lowbit
(
p
2
+
q
2
)
\operatorname{lowbit}{(p^2+q^2)}
lowbit(p2+q2),可得
lowbit
(
p
4
−
q
4
)
=
4
lowbit
(
p
−
q
)
\operatorname{lowbit}{(p^4-q^4)}=4 \operatorname{lowbit}{(p-q)}
lowbit(p4−q4)=4lowbit(p−q);
再在等式两边同时乘上
lowbit
(
p
2
+
q
2
)
\operatorname{lowbit}{(p^2+q^2)}
lowbit(p2+q2),可得
lowbit
(
p
8
−
q
8
)
=
8
lowbit
(
p
−
q
)
\operatorname{lowbit}{(p^8-q^8)}=8 \operatorname{lowbit}{(p-q)}
lowbit(p8−q8)=8lowbit(p−q);
……
以此类推,
lowbit
(
p
2
x
−
1
−
q
2
x
−
1
)
=
lowbit
(
p
−
q
)
⋅
2
x
−
1
\operatorname{lowbit}{\left(p^{2^{x-1}}-q^{2^{x-1}}\right)}=\operatorname{lowbit}{(p-q)}\cdot 2^{x-1}
lowbit(p2x−1−q2x−1)=lowbit(p−q)⋅2x−1
得证。
- 当n是奇数时,由引理2可得 lowbit ( a n − b n ) = lowbit ( a − b ) \operatorname{lowbit}{(a^n-b^n)}=\operatorname{lowbit}{(a-b)} lowbit(an−bn)=lowbit(a−b);
- 当n是偶数时,令
n
=
2
x
y
n=2^x y
n=2xy(y是奇数),那么现在要证
lowbit
(
a
2
x
y
−
b
2
x
y
)
=
lowbit
(
a
−
b
)
⋅
lowbit
(
a
+
b
)
⋅
2
x
−
1
\operatorname{lowbit}{\left(a^{2^x y}-b^{2^x y}\right)}=\operatorname{lowbit}{(a-b)}\cdot \operatorname{lowbit}{(a+b)}\cdot 2^{x-1}
lowbit(a2xy−b2xy)=lowbit(a−b)⋅lowbit(a+b)⋅2x−1
由引理4得, lowbit ( a 2 x − b 2 x ) = lowbit ( a − b ) ⋅ lowbit ( a + b ) ⋅ 2 x − 1 \operatorname{lowbit}{\left(a^{2^x}-b^{2^x}\right)}=\operatorname{lowbit}{(a-b)}\cdot \operatorname{lowbit}{(a+b)}\cdot 2^{x-1} lowbit(a2x−b2x)=lowbit(a−b)⋅lowbit(a+b)⋅2x−1
由引理2得, lowbit ( a 2 x y − b 2 x y ) = lowbit ( ( a 2 x ) y − ( b 2 x ) y ) = lowbit ( a 2 x − b 2 x ) \operatorname{lowbit}{\left(a^{2^x y}-b^{2^x y}\right)}=\operatorname{lowbit}{\left(\left(a^{2^x}\right)^y-\left(b^{2^x}\right)^y\right)}=\operatorname{lowbit}{\left(a^{2^x}-b^{2^x}\right)} lowbit(a2xy−b2xy)=lowbit((a2x)y−(b2x)y)=lowbit(a2x−b2x)
因此 lowbit ( a n − b n ) = lowbit ( a − b ) ⋅ lowbit ( a + b ) ⋅ lowbit ( n 2 ) \operatorname{lowbit}{\left(a^n-b^n\right)}=\operatorname{lowbit}{(a-b)}\cdot \operatorname{lowbit}{(a+b)}\cdot \operatorname{lowbit}{\left(\frac{n}{2}\right)} lowbit(an−bn)=lowbit(a−b)⋅lowbit(a+b)⋅lowbit(2n)
得证。
CODE
#include<cstdio>
using namespace std;
typedef unsigned long long ll;
#define P 1000000007
inline void read(int &x)
{
char ch;while(ch=getchar(),ch<'0'||ch>'9');x=ch-48;
while(ch=getchar(),ch>='0'&&ch<='9') x=x*10+ch-48;
}
inline long long lowbit(long long x){return x&-x;}
inline int pow1(int x,int y)
{
int s=1;
while(y)
{
if(y&1) s=1LL*s*x%P;
x=1LL*x*x%P,y>>=1;
}
return s;
}
inline ll pow2(ll x,int y)
{
ll s=1;
while(y)
{
if(y&1) s*=x;
x*=x,y>>=1;
}
return s;
}
int main()
{
freopen("journey.in","r",stdin);
freopen("journey.out","w",stdout);
int n,a,b,t,x,y;ll u,v;long long tmp;
read(t);
while(t--)
{
read(a),read(b),read(n);
x=a&-a,y=b&-b;
if(x>y) x=y;a/=x,b/=x;
if((a&1)^(b&1)) printf("%d\n",pow1(x,n));
else
{
u=pow2(a,n),v=pow2(b,n);
u^=v;if(u&(1ll<<63)) u^=1ll<<63;tmp=u;
printf("%d\n",lowbit(tmp)%P*pow1(x,n)%P);
}
}
return 0;
}