模
题意:
给定四个正整数
a
,
b
,
c
,
k
a,b,c,k
a,b,c,k,回答是否存在一个正整数
n
n
n,使得
a
∗
n
a*n
a∗n在
k
k
k进制表示下的各位的数值之和模
b
b
b为
c
c
c。
先给出一个结论:
一个数十进制数
x
x
x化成
k
k
k进制数
y
y
y,那
y
y
y的各个位数加的和
s
u
m
sum
sum起来一定是
x
+
(
1
−
k
)
∗
t
x+(1-k)*t
x+(1−k)∗t
简单证明:
x
<
k
x < k
x<k,那
y
=
x
y = x
y=x
假设
x
>
=
k
x >= k
x>=k
1.
x
=
k
,
y
=
(
10
)
k
,
s
u
m
=
1
=
x
+
(
1
−
k
)
x = k,y = (10)_k,sum=1=x+(1-k)
x=k,y=(10)k,sum=1=x+(1−k)
2.
x
=
k
2
,
y
=
(
100
)
k
,
s
u
m
=
1
=
x
+
(
1
−
k
2
)
=
x
+
(
1
−
k
)
(
1
+
k
)
x=k^2,y=(100)_k,sum=1=x+(1-k^2)=x+(1-k)(1+k)
x=k2,y=(100)k,sum=1=x+(1−k2)=x+(1−k)(1+k)
3.
x
=
k
3
,
y
=
(
1000
)
k
,
s
u
m
=
1
=
x
+
(
1
−
k
3
)
=
x
+
(
1
−
k
)
(
k
2
+
k
+
1
)
x=k^3,y=(1000)_k,sum=1=x+(1-k^3)=x+(1-k)(k^2+k+1)
x=k3,y=(1000)k,sum=1=x+(1−k3)=x+(1−k)(k2+k+1)
……
对于任意一个数
X
X
X,都能写成
X
1
∗
1
+
X
2
∗
k
+
.
.
.
+
X
t
∗
k
X_1*1+X_2*k+...+X_t*k
X1∗1+X2∗k+...+Xt∗k
也就说明
s
u
m
sum
sum一定是
X
+
(
1
−
k
)
∗
t
X+(1-k)*t
X+(1−k)∗t
之后我们根据题意:
a
∗
n
a*n
a∗n化成
k
k
k进制后的
s
u
m
=
a
∗
n
+
(
1
−
k
)
∗
t
sum = a*n + (1-k)*t
sum=a∗n+(1−k)∗t;
要满足
s
u
m
%
b
=
c
sum\%b = c
sum%b=c也就是
a
∗
n
+
(
1
−
k
)
∗
t
+
b
y
≡
c
(
m
o
d
b
)
a*n+(1-k)*t+by\equiv c(mod b)
a∗n+(1−k)∗t+by≡c(modb)
根据扩展欧几里得性质,
c
c
c必须是
g
c
d
(
n
,
t
,
b
)
gcd(n,t,b)
gcd(n,t,b)的倍数时才有解。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll gcd(ll x, ll y) {
return y == 0 ? x : gcd(y, x%y);
}
int main() {
int t;
cin >> t;
while(t--) {
ll a, b, c, k;
cin >> a >> b >> c >> k;
if(c % gcd(gcd(a, b), (1-k)) != 0) printf("No\n");
else printf("Yes\n");
}
return 0;
}