HDU5690: All X(大数取模,同余)

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


转载于:https://www.cnblogs.com/junior19/p/6730081.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值