您的位置:首页 > 其它

解题报告:ZOJ3457 Absence Number (打表+数学)

2016-05-03 11:03 513 查看

题意:

输入n(00到99),求一个最小的正整数ans使得 1/ans 除去前导零的小数位上包含00到99中除了n的所有数。

分析:

n的范围比较小,考虑打表,每个m的小数点后位数最多m次会重复,所以每个m循环m+1次然后进行一次包含数的判断,如果包含了除去某个数的其余所有数,那么m就是对应这个数的答案,用0标识取得最小答案。

#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;
/******************************************打表代码***************************************************************
int ans[100];
bool have[100];
int dig[1000000];
int d,num=0;

inline bool pass(){
for(int i=0;i<100;i++)
if(!ans[i])return false ;
return true ;
}

inline void oper(int& value ,int n){
value*=10;
int x = value/n;
dig[d++] = x;
}

inline void get(){
int x = 0 ;
for(int i=0;i<d;i++){
x = ( x*10+dig[i] ) %100;
have[x] = true;
}
}

inline void done(int in){
get();
int none = 0;int x;
for(int i=0;i<100&&none<=1;i++){
if(!have[i]){
x=i;none++;
}
}if(none==1&&!ans[x]){
ans[x] = in ;num++;
}
}
*************************************************************************************/
int ANS[100]={
76344,27839,2938,5246,8662,13161,7412,7843,3386,4566,8596,981,1654
,5609,2623,11357,5703,13634,1269,7067,10146,7748,
1017,2006,13987,2737,1007,9269,2191,9633,5637,17406,
4746,327,19798,10219,6902,11815,7869,731,5972,5473,8849,
9822,3222,16274,2751,22414,2183,5974,7573,5391,6837,8762,
7747,1962,5629,9691,10158,1493,1462,15796,3594,8109,2359,14382
,339,6873,19194,10262,5459,5163,20049,4028,3113,27279,1003
,3924,1937,2679,5183,3378,2969,21395,13907,3074,4911,827,6471,4279,2283,8465,2538,527,17751,7526,9422,7345,5083,791
};

int main()
{

/*********************打表代码
freopen("data.in","w",stdout);
for(int n=101;num<100;n++){
int value = 10;d = 0;
while(value<n)value*=10;
memset(have,false,sizeof(have));
memset(dig,false,sizeof(dig));
for(int i=0;i<=n&&value;i++){
oper(value,n) ;
value %= n;
}
done(n);
}
for(int i=0;i<100;i++)printf("%d,",ans[i]);

return 0;
*********************/
int n;
while(scanf("%d",&n)==1){
printf("%d\n",ANS
);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: