CodeVS 第二次月赛 A

题目描述 Description

切记不要加任何文件读写, 本次比赛暂不支持ifndef ONLINE_JUDGE。请互相转告。评测机是linux

tgopknight是著名的计算机天才,他十分喜欢研究二进制,所以他对0 和 1特别感兴趣。

由于他很喜欢读宋词,在文学的熏陶下,他发现只有 , 组成的十进制数是十分有特点的,他定义为特别的数:

. “1"是一个的特别的数。

. 一个以“1"结尾的特别的数在末尾加上“1"或“0"都是特别的数

. 一个以“0"结尾的特别的数在末尾加上“0"是特别的数。

很快他发现了这些数字之间隐藏的奥秘!现在他想知道这些特别的数中是否有一个能被 M整除?

如果存在,请输出特别的数中最小一个满足条件的数,如果不存在这样的数,请输出"Impossible"!

     题解:

仔细分析可以得出,特别的数由n(n>0)个连续的1和m个连续的0组成。

我们可以先处理出m中2因子的个数和5因子的个数,那么答案0数就是两者的大值啦,这是很显然的。

然后再处理多少个1,看多少个连续的1%m==0,动态维护一下余数,等于0就跳出。

%%%__debug大神给予的辅导。

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXL=1e7;
int m;
int main()
{
    scanf("%d",&m);
    int cnt2=0,cnt5=0,tot0=0;
    if(m==1)
    {
        printf("1\n");
        return 0;
    }
    while(!(m&1))
    {
        cnt2++;
        m>>=1;
    }
    while(m%5==0)
    {
        cnt5++;
        m/=5;
    }
    tot0=max(cnt2,cnt5);
    int res=1,tot1=1;
    while(tot1<=MAXL)
    {
        res=((res*(10%m))%m+1)%m;
        tot1++;
        if(res==0)break;
    }
    while(tot1--)
       putchar('1');
    while(tot0--)
       putchar('0');
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值