gmoj 6844. 【2020.11.02提高组模拟】旅途和生活

题目

https://gmoj.net/senior/#main/show/6844

前言

这道题居然在题面中给出了结论(如果不给结论,该是T4难度的吧)
本来是不打算写题解的,但是由于这题给出的结论的证明很有价值,我就写下来吧。
SLS大佬太强啦%%%

题解

考场上原本是没什么思路的。但是我看到了这句话:
在这里插入图片描述
而上表说3,4,5,6保证a和b都是奇数。
我们可以先把a和b都写成 2 x y 2^xy 2xy的形式,使得它们中至少有一个变成了奇数。接下来分类讨论:

  1. 当a和b都是奇数时,根据题目给出的结论,可以只存下 a n a^n an b n b^n bn最后的63个二进制位。因此用unsigned long long搞快速幂就好了;
  2. 当a和b一奇一偶时, lowbit ⁡ ( a n − b n ) \operatorname{lowbit}(a^n-b^n) lowbit(anbn)显然是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(anbn)=lowbit(ab),lowbit(ab)lowbit(a+b)lowbit(2n),2n2n
由于 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(anbn)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,bN,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(2x1x22y1y2)=lowbit(2x1+y1x2y2)=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(anbn)=lowbit(ab)
证明
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(anbn)=lowbit((ab)i=0n1aibn1i)
那么现在要证明: ∑ 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=0n1aibn1i1(mod2)
因为 a , b a,b a,b都是奇数,因此 a i , b n − 1 − i a^i,b^{n-1-i} ai,bn1i是奇数, a i ⋅ b n − 1 − i ≡ 1 ( m o d 2 ) a^i\cdot b^{n-1-i}\equiv 1\pmod{2} aibn1i1(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=0n1aibn1i1(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在二进制下的后两位:

  1. a a a的后两位是01, b b b的后两位是01时, a 2 , b 2 a^2,b^2 a2,b2的后两位都是01,得证;
  2. a a a的后两位是01, b b b的后两位是11时, a 2 , b 2 a^2,b^2 a2,b2的后两位都是01,得证;
  3. a a a的后两位是11, b b b的后两位是01时, a 2 , b 2 a^2,b^2 a2,b2的后两位都是01,得证;
  4. 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(a2xb2x)=lowbit(ab)lowbit(a+b)2x1
证明
t = x − 1 , p = a 2 , q = b 2 t=x-1,p=a^2,q=b^2 t=x1,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(p2x1q2x1)lowbit(p2tq2t)=lowbit(pq)2x1=lowbit(pq)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(p2q2)=lowbit(pq)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(p4q4)=4lowbit(pq)
再在等式两边同时乘上 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(p8q8)=8lowbit(pq)
……
以此类推, 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(p2x1q2x1)=lowbit(pq)2x1

得证。


  1. 当n是奇数时,由引理2可得 lowbit ⁡ ( a n − b n ) = lowbit ⁡ ( a − b ) \operatorname{lowbit}{(a^n-b^n)}=\operatorname{lowbit}{(a-b)} lowbit(anbn)=lowbit(ab)
  2. 当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(a2xyb2xy)=lowbit(ab)lowbit(a+b)2x1
    引理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(a2xb2x)=lowbit(ab)lowbit(a+b)2x1
    引理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(a2xyb2xy)=lowbit((a2x)y(b2x)y)=lowbit(a2xb2x)
    因此 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(anbn)=lowbit(ab)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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值