#include<bits/stdc++.h>
using namespace std;
int vis[11111];
int bb[11111];
int main()
{
int t;
int x,k,c;
long long m;
int kase=0;
scanf("%d",&t);
while(t--) {
scanf("%d%lld%d%d",&x,&m,&k,&c);
memset(vis,0,sizeof vis);
int sum=0;
int len=0;
int head=0;
int fa=0;
for(int i=1;i<=m;i++) {
sum=sum*10+x;
sum%=k;
if(vis[sum]!=0) {
len=i-vis[sum];
head=vis[sum];
fa=1;
break;
}
vis[sum]=i;
bb[i]=sum;
}
if(fa==1) {
int ansi=(m-head)%len+head;
if(bb[ansi]==c) {
printf("Case #%d:\n",++kase);
printf("Yes\n");
}
else {
printf("Case #%d:\n",++kase);
printf("No\n");
}
}
else {
if(bb[m]==c) {
printf("Case #%d:\n",++kase);
printf("Yes\n");
}
else {
printf("Case #%d:\n",++kase);
printf("No\n");
}
}
}
return 0;
}
题意:大概就是有连续m个x组成的数,问这个数是否modk=c m<10^10 k<10000
思路:思路很明显,m很大,不能直接暴力枚举,观察k很小只有10000也就是mod后的余数最多就10000中可能。基本的循环节思路。