Bestcoder 大数求余

来源:互联网 发布:淘宝9月份活动 编辑:程序博客网 时间:2024/05/22 01:41
                                                                                                    

                                       大数求余


 Time Limit: 2000/1000 MS (Java/Others)
 
 Memory Limit: 65536/65536 K (Java/Others)
Problem Description

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

F(x,m)\ mod\ k\ \equiv \ cF(x,m) mod k  c

Input

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

1\leq x\leq 91x9

1\leq m\leq 10^{10}1m1010

0\leq c< k\leq 10,0000c<k10,000

Output

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

Sample Input
31 3 5 21 3 5 13 5 99 69
Sample Output
Case #1:NoCase #2:YesCase #3:Yes


using namespace std;int visit[11000];int num[11000];int main(){    int t,sum = 1;    scanf("%d",&t);    while(t--)    {        int x,m,k,c;        scanf("%d%d%d%d",&x,&m,&k,&c);        memset(visit,0,sizeof(visit));        memset(num,0,sizeof(num));        int ans = 0,cas = 0;        while(1)        {            ans = ans * 10 + x;            ans = ans % k;            if(visit[ans] == 1) //找到循环点跳出                break;            else                visit[ans] = 1;            num[cas++] = ans;//记录余数,case代表周期个数        }        m = (m-1) % cas;//求余的时候要注意,余数只有(0~ cas-1 )        printf("Case #%d:\n",sum++);        if(num[m] == c)            printf("Yes\n");        else            printf("No\n");    }    return 0;}


0 0