/ Vijos / 讨论 / 题解 /

noip2012第一次模拟赛简要题解

进制转换:

首先我们将十进制循环小数转换成a/b的形式。

转换的方法是解方程,例如转换0.0(3),我们将其设为X。

那么100X=3.(3),10X=0.(3),可以得到方程100X-10X=3。

所以解得 X=3/90=1/30。

不难发现,我们列方程的方法是将X的小数点向右移动若干位,移出两个正好错开了循环节长度为的小数,此时两个数相减,可以将循环部分消除,便可以解出方程。

一般地,假设有p1位非循环位,非循环部分形成的十进制数是k1;有p2位循环节,循环节部分形成的十进制数是k2。

可以得到方程:10^(p1+p2)*X-(10^p1)*X=(10^p2)k1+k2-k1。

解出即可。

接着我们将十进制分数a/b转换成二进制小数。

由于数据保证b

11 条评论

  • @ 2012-10-30 10:58:47

    RE:hjl_

    RE:hjl_

    让非循环节部分长度尽可能短。

  • @ 2012-10-29 16:24:32

    进制转换

    假如是1/3

    那么答案是0.0(10)还是0.(01)

  • @ 2012-10-29 16:11:43

    UrzoyHe

    进制转换的十进制小数转换成分数可以这样:

    0.X(Y) 用m表示X的长度(非循环节长度); n表示Y的长度(循环节长度);

    a/b== X/(10^m)+Y/(9..9*10^m) {9..9 -->n个9}

    == (9..9X+Y)/(9..*10^m)

    若gcd(a,b)1 则化简 (a div gcd(a,b))/(b div gcd(a,b));

    {可能有手滑打错的地方 自己注意就行了}

  • @ 2012-10-29 15:37:41

    有标程吗...

    第二题如果不按照顺序搜索,如何保证解的正确性?后一个的时间一定要大于前一个,难道搜到底了再判断?

  • @ 2012-10-29 15:05:43

    第二题贪心,好像90分。我是这样做的。先假设最后一封贺卡来自0时区,然后从n-1循环到1,每次都选取能满足条件(时间的先后关系)的并且尚未用过的时区。最后都加上一个值,使得所有时区都在0~n-1之间。不知道哪里错了?

  • @ 2012-10-29 14:41:23

    第二题可不可以使用差分约束系统或者递推解决?求比较有代表性的大数据

  • @ 2012-10-29 14:16:44

    关于进制转换这题

    个人觉得直接模拟性价比较高

    具体做法如下

    将十进制的循环部分扩增到1000位

    然后不断*2,hash判重

  • @ 2012-10-29 13:54:55

    同求数据...

  • @ 2012-10-29 11:17:16

    请问能放出数据吗?

  • @ 2012-10-29 11:16:01

    有没有标程可以参考一下呢

    有没有标程可以参考一下呢

  • @ 2012-10-29 09:38:46

    单调队列!?

    orz LZ

    vijos上有关单调队列的题都有什么? --突然很感兴趣

  • 1