contest8-T2
题目描述
F(x,m) 代表一个全是由数字x组成的m位数字。请计算,以下式子是否成立:
F(x,m) mod k ≡ c
输入
第一行一个整数T,表示T组数据。每组测试数据占一行,包含四个数字x,m,k,c
输出
对于每组数据,输出两行: 第一行输出:"Case #i:"。i代表第i组测试数据。 第二行输出“Yes” 或者 “No”,代表四个数字,是否能够满足题目中给的公式。
样例输入
3
1 3 5 2
1 3 5 1
3 5 99 69
样例输出
Case #1:
No
Case #2:
Yes
Case #3:
Yes
提示
对于第一组测试数据:111 mod 5 = 1,公式不成立,所以答案是”No”,而第二组测试数据中满足如上公式,所以答案是 “Yes”。
1<=x<=9 1<=m<=10^10 0<=c<k<=10000
百度之星初赛的原题,当时没啥思路,没想到考试的时候一下子就想出来了
一个m位的全x数字就是(10^0+10^1+10^2+10^3....+10^(m-1))*x
10^0加到10^(m-1)可以用快速幂求和解决
判断是否模k=c即可
#include<cstdio>
#include<iostream>
#include<cstring>
#define ll long long
using namespace std;
int cas;
ll x,m,mod,c,ans;
ll mi[105],sum[105];
ll quick(ll k,int d)
{
if(k==1) return 10;
if(mi[d]!=-1) return mi[d];
ll s=(quick(k/2,d+1)*quick(k/2,d+1))%mod;
if(k%2==1) s=(s*10)%mod;
return mi[d]=s;
}
ll solve(ll k,int d)
{
if(k==1) return 10;
if(sum[d]!=-1) return sum[d];
ll s=((solve(k/2,d+1)*quick(k/2,d+1))%mod+solve(k/2,d+1))%mod;
if(k%2==1) s=(s+quick(k,d))%mod;
return sum[d]=s;
}
int main()
{
cin>>cas;
for(int i=1;i<=cas;i++)
{
memset(sum,-1,sizeof(sum));
memset(mi,-1,sizeof(mi));
scanf("%lld%lld%lld%lld",&x,&m,&mod,&c);
m--;
ans=solve(m,1)+1;
ans=(ans*x)%mod;
printf("Case #%d:\n",i);
if(ans%mod==c) printf("Yes\n");else printf("No\n");
}
return 0;
}