模(进制转换结论,扩展欧几里得性质)


题意:
给定四个正整数 a , b , c , k a,b,c,k a,b,c,k,回答是否存在一个正整数 n n n,使得 a ∗ n a*n an 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+(1k)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=ky=(10)ksum=1=x+(1k)
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+(1k2)=x+(1k)(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+(1k3)=x+(1k)(k2+k+1)
……
对于任意一个数 X X X,都能写成 X 1 ∗ 1 + X 2 ∗ k + . . . + X t ∗ k X_1*1+X_2*k+...+X_t*k X11+X2k+...+Xtk
也就说明 s u m sum sum一定是 X + ( 1 − k ) ∗ t X+(1-k)*t X+(1k)t

之后我们根据题意:
a ∗ n a*n an化成 k k k进制后的 s u m = a ∗ n + ( 1 − k ) ∗ t sum = a*n + (1-k)*t sum=an+(1k)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) an+(1k)t+byc(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;
}
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值