数论(快速幂) HDU-5690 All X

来源:互联网 发布:c 界面编程 编辑:程序博客网 时间:2024/05/27 09:46

All X

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1672    Accepted Submission(s): 729



Problem Description
F(x,m) 代表一个全是由数字x组成的m位数字。请计算,以下式子是否成立:

F(x,m) mod kc
 

Input
第一行一个整数T,表示T组数据。
每组测试数据占一行,包含四个数字x,m,k,c

1x9 

1m1010

0c<k10,000
 

Output
对于每组数据,输出两行:
第一行输出:"Case #i:"。i代表第i组测试数据。
第二行输出“Yes” 或者 “No”,代表四个数字,是否能够满足题目中给的公式。
 

Sample Input
31 3 5 21 3 5 13 5 99 69
 

Sample Output
Case #1:NoCase #2:YesCase #3:Yes
Hint
对于第一组测试数据:111 mod 5 = 1,公式不成立,所以答案是”No”,而第二组测试数据中满足如上公式,所以答案是 “Yes”。
 

全是x的m位数可以算成(10^m-1)/9*x,由(10^m-1)/9*x%mod 同时扩大9倍, (10^m-1)*x%(9*mod) == 9*c。就可以用快速幂求出来了。

将all x转化的思想和扩大9倍削去分母,值得回味。。。
#include <iostream>#include <cstdio>#include <cstring>typedef long long ll;using namespace std;ll pow_mod(ll x, ll n, ll mod) {    ll res = 1;    while(n > 0) {        if(n&1)            res = res*x%mod;        x = x*x%mod;        n >>= 1;    }    return res;}int main(){    int T;    ll x, m, c, k;    ll res, j = 1;    scanf("%d", &T);    while(T--) {        res = 0;        scanf("%lld%lld%lld%lld", &x, &m, &k, &c);        k *= 9;        res = (pow_mod(10, m, k) - 1)*x%k;        printf("Case #%d:\n", j++);        if(res/9 == c)            printf("Yes\n");        else            printf("No\n");    }    return 0;}


0 0