#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int x, k, c;
long long m;
struct Mat {
int v[2][2];
Mat() {memset(v, 0, sizeof(v));}
Mat operator * (const Mat& c) const {
Mat ans;
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
for (int x = 0; x < 2; x++) {
ans.v[i][j] = (ans.v[i][j] + v[i][x] * c.v[x][j] % k) % k;
}
}
}
return ans;
}
};
Mat pow_mod(Mat x, long long k) {
Mat ans;
for (int i = 0; i < 2; i++) ans.v[i][i] = 1;
while (k) {
if (k&1) ans = ans * x;
x = x * x;
k >>= 1;
}
return ans;
}
int T;
int main() {
int cas = 0;
scanf("%d", &T);
while (T--) {
scanf("%d%lld%d%d", &x, &m, &k, &c);
Mat A;
A.v[0][0] = 10 % k; A.v[0][1] = 1 % k;
A.v[1][0] = 0 % k; A.v[1][1] = 1 % k;
A = pow_mod(A, m);
printf("Case #%d:\n", ++cas);
if (x * A.v[0][1] % k == c) printf("Yes\n");
else printf("No\n");
}
return 0;
}
矩阵快速幂模板
最新推荐文章于 2024-07-25 12:55:56 发布