题目描述
在被数分课完虐之后LazyChild决定去研究分数。他发现一件很有爱的事情,很多分数的小数形式四舍五入到某一位后都是一样的。比如四舍五入到千分位之后等于0.500的有12,5001000,甚至还有6001201,2893257869 等。LazyChild现在给你一个四舍五入到某一位的小数v(不超过7位),他要你找出有多少个分数的小数形式四舍五入到这一位等于给定的v。为了让这个任务能够完成,LazyChild规定分子和分母都是不超过1000000000的正整数。
输入格式
一行一个正实数v(0 <v< 1)小数点后有n位(1 ≤n≤7)
输出格式
一个整数表示分子和分母不超过1000000000的分数四舍五入到小数点后n位等于v的分数的个数。
样例输入
0.5000000
样例输出
50000000050
【解析】
这个题对模型的抽象能力要求比较高。
考虑0.5这个数(注:和样例本质不同),满足条件的数的区间就是[0.45,0.55),即0.45<=y/x<0.55(x,y<=10^9)。放到坐标系里根据条件画出可行域,则可行域内所有整点即为所求。具体方法拿图说话比较好一点,明天再弄,先贴代码。
const d=1000000000; var v:real; a,l,r:longint; ans:int64; s:string; function gcd(i,j:longint):longint; begin if i mod j = 0 then exit(j); exit(gcd(j,i mod j)); end; function getmatrix(y:longint):int64; var i,j:longint; m,sum:int64; begin m:=gcd(d,y)+1; sum:=y; for i:=1 to 9 do sum:=sum*10; sum:=sum+d+y+1-m; sum:=sum div 2; exit(sum); end; procedure change; var t:string; i,j,len:longint; b:int64; begin len:=length(s)-pos('.',s); t:=copy(s,pos('.',s)+1,len); val(t,a); j:=1; for i:=1 to 9-len do j:=j*10; a:=a*j; j:=1; for i:=1 to 8-len do j:=j*10; l:=a-5*j; r:=a+5*j; //writeln(l);writeln(r); end; begin readln(s); change; ans:=getmatrix(r)-getmatrix(l); writeln(ans); end.