原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=5690
All X
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 3308 Accepted Submission(s): 1374
Problem Description
F(x,m) 代表一个全是由数字x组成的m位数字。请计算,以下式子是否成立:
F(x,m) mod k ≡ c
Input
第一行一个整数T,表示T组数据。
每组测试数据占一行,包含四个数字x,m,k,c
1≤x≤9
1≤m≤1010
0≤c<k≤10,000
Output
对于每组数据,输出两行:
第一行输出:“Case #i:”。i代表第i组测试数据。
第二行输出“Yes” 或者 “No”,代表四个数字,是否能够满足题目中给的公式。
Sample Input
3
1 3 5 2
1 3 5 1
3 5 99 69
Sample Output
Case #1:
No
Case #2:
Yes
Case #3:
Yes
Hint
对于第一组测试数据:111 mod 5 = 1,公式不成立,所以答案是”No”,而第二组测试数据中满足如上公式,所以答案是 “Yes”。
Source
2016"百度之星" - 初赛(Astar Round2A)
Recommend
wange2014
题解:这是一道数学题,用一个很简便的数学公式,F(x,m)表示m位个x构成的数,怎么求这个数呢?F =((10的m次方-1)/9)x(就是m位个1再乘以x就是结果),用大数取模公式拆开,并且对10的m次方用快速幂即可。
这里有个疑惑,为什么取模,是模9k呢?
原因是这样的:
若:a%bc,则有t*b+ca(其中a是倍数)
同理:(((10^m-1)/9)x) % k ==c
则有:((10^m-1)/9)x == tk + c
则有:((10^m-1)x)/9 == tk + c
则有:(10^m-1)x == 9tk + 9c
所以:(10^m-1)x == t(9k) + 9c
所以:((10^m-1)x)%(9k) == 9c
其中((10^m-1)x)%(9k) ==
(10^m%(9*k) - 1)x%(9k)
AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
long long int x,m,k,c;
int res[1000];
//快速幂求a^b%m的算法
long long quickmod(long long a,long long b,long long m)
{
long long ans = 1;
while(b)//用一个循环从右到左遍历b的所有二进制位
{
if(b&1)//判断此时b[i]的二进制位是否为1
{
ans = (ans*a)%m;//乘到结果上,这里a是a^(2^i)%m
b--;//把该为变0
}
b/=2;
a = a*a%m;
}
return ans;
}
int main()
{
int T;
cin>>T;
for(int i=1;i<=T;i++)
{
memset(res,0,sizeof(res));
cin>>x>>m>>k>>c;
//cout<<x<<m<<k<<c<<endl;
int ans = 0;
cout<<"Case #"<<i<<":"<<endl;
int quick_mod = quickmod(10,m,9*k);
if((quick_mod-1)*x%(9*k) == 9*c)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
return 0;
}