junior19

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

All X

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


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

计算循环节,注意循环节不一定从第一位开始。


# include <stdio.h>
# include <string.h>
int main()
{
    int i, t, x, k, c, icount, cnt, vis[10005], num[10005];
    long long ans, m;
    scanf("%d",&t);
    for(int T=1; T<=t; ++T)
    {
        memset(vis, 0, sizeof(vis));
        memset(num, 0, sizeof(num));
        icount = cnt = ans = 0;
        scanf("%d%lld%d%d",&x,&m,&k,&c);
        for(i=1; i<=m; ++i)
        {
            ans = (ans*10 + x) % k;
            if(!vis[ans])
            {
                num[++icount] = ans;
                vis[ans] = 1;
            }
            else
                break;
        }
        if(i==m+1)
        {
            if(ans==c)
                printf("Case #%d:\nYes\n",T);
            else
                printf("Case #%d:\nNo\n",T);
            continue;

        }
        for(i=1; i<=icount; ++i)
            if(num[i]==ans)
                break;
        cnt = (m-i+1)%(icount-i+1);
        if(cnt==0)
            ans = num[icount];
        else
            ans = num[i-1+cnt];
        if(ans==c)
            printf("Case #%d:\nYes\n",T);
        else
            printf("Case #%d:\nNo\n",T);
    }
    return 0;
}


posted on 2017-01-18 20:17  junior19  阅读(157)  评论(0编辑  收藏  举报