hdu5690 快速模幂

来源:互联网 发布:淘宝客服工资待遇 编辑:程序博客网 时间:2024/05/23 01:12

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5690

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

F(x,m) mod k  c


思路:因为有m个x,还有取模操作,所以可以快速模幂把m位的x对k取模的结果求出来,然后在和c对k取模结果比较即可。因为取模是有个除法操作

所以可以用逆元,也可以直接乘到k上面去。。


#include <iostream>#include <cstdio>#include <string>#include <cstring>#include <fstream>#include <algorithm>#include <cmath>#include <queue>#include <stack>#include <vector>#include <map>#include <set>#include <iomanip>using namespace std;//#pragma comment(linker, "/STACK:102400000,102400000")#define maxn 200005#define MOD 1000000007#define mem(a , b) memset(a , b , sizeof(a))#define LL long long#define ULL unsigned long longconst long long INF=0x3fffffff;LL ans ;LL x , m , k , c;LL quick_pow(LL m , LL mod){    LL res = 1;    LL tmp = 10;    while(m)    {        if(m & 1)        {            res *= tmp;            res %= mod;        }        tmp *= tmp;        tmp %= mod;        m >>= 1;    }    return res;}int main(){    int t , ncase = 1;    scanf("%d" , &t);    while(t--)    {        scanf("%lld %lld %lld %lld" , &x , &m , &k , &c);        k *= 9;        LL ans = quick_pow(m , k);        ans = ( (ans - 1 + k) % k);        ans = (ans *x) % k;        printf("Case #%d:\n" , ncase ++);        if(ans == (c*9)%k) printf("Yes\n");        else printf("No\n");    }    return 0;}


0 0