HDU 5690 (分治 || 循环节)

来源:互联网 发布:极度恐慌网络 编辑:程序博客网 时间:2024/05/29 03:15

All X

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


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

F(x,m) mod k  c
 

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”。
 


分治做很简单,每次求出一半%k的值然后快速幂求出10^x次的值,然后判断长度

奇偶就好了.

也可以找循环节.

#include <cstring>#include <iostream>#include <cstdio>#include <algorithm>#include <vector>#include <cmath>#include <map>#include <queue>using namespace std;#define maxn 11111long long x;long long m, c, mod;long long qpow (long long m, long long n, long long k){    long long b = 1;    while (n > 0)    {          if (n & 1)             b = (b*m)%k;          n = n >> 1 ;          m = (m*m)%k;    }    return b;}long long f (long long a) {    if (a == 1) {        return x%mod;    }    long long cur = f (a>>1);    long long ans = cur*qpow (1LL*10, a>>1, mod)%mod+cur; ans %= mod;    if (a&1) {        ans = ans*10%mod+x;        ans %= mod;    }    return ans;}void solve () {    if (f (m)%mod == c) {        printf ("Yes\n");    }    else        printf ("No\n");}int main () {    //freopen ("in.txt", "r", stdin);    int t, kase = 0;    scanf ("%d", &t);    while (t--) {        printf ("Case #%d:\n", ++kase);        cin >> x >> m >> mod >> c;        solve ();    }    return 0;}


0 0
原创粉丝点击