题目描述 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');
}