方法一 :因为m为10^10 次方,很大,所以猜测应该会出现循环节,
于是找到循环节映射出来即可
方法二:
m个x组成的数可以表示为x*(1+10+10^2+...+10^m-1)=x*(10^m-1)/9;
即x*(10^m-1)/9%k==c
x*(10^m-1)%(9*k)==9*c
用快速幂去做去做。
#include
#include
#include
#define LL long long
#define INF 0x3f3f3f3f
#define bug puts("**********");
using namespace std;
int vis2[200000];
int vis[1100000];
int main()
{
LL x,m,k,c;
int t;
scanf("%d",&t);
for(int cas=1; cas<=t; cas++)
{
scanf("%lld%lld%lld%lld",&x,&m,&k,&c);
LL sum=0;
memset(vis2,-1,sizeof(vis2));
int start=-1,bit=0;
printf("Case #%d:
",cas);
for(int i=0; i=start) ///判断是否到达了循环的部分
{
if(vis[(m-start-1)%bit+start]==c) ///哈希得到值
puts("Yes");
else
puts("No");
}
else
{
if(vis[m]==c)
puts("Yes");
else
puts("No");
}
}
}
return 0;
}