题解

15 条题解

  • 0
    @ 2010-03-09 15:50:40

    (n+1)(n-1)可以过一个数据.. 什么原理啊- -

  • 0
    @ 2009-11-05 12:29:26

    尽管我觉得这道题有问题,我试了m=10,发现是20次,而程序输出60

    http://forum.noi.cn/frame.php?frameon=yes&referer=http%3A//forum.noi.cn/thread-27035-1-1.html

    我现在不完全归纳出应需2×m次,这和上面的网址模拟出的是一样的

    再好好想想,我觉得至少能递推,然后求通项公式

    附程序

    program p1056;

    var m:int64;

    function solve(m:int64):int64;

    var i,t,d: longint;

    flag: Boolean;

    begin

    if (m = 1) then

    solve :=2

    else begin

    d := 2*m+1; t := 2;

    i := 1; flag := False;

    repeat

    if (t = 1) then

    begin

    solve :=i*m; flag := True;

    end

    else if (t=2*m) then

    begin

    solve := i*m-1; flag := True;

    end

    else

    t:=(t*2) mod d;

    i:=i+1;

    until flag;

    end

    end;

    begin

    read(m);

    writeln(solve(m));

    end.

  • 0
    @ 2009-10-05 10:01:52

    置换群?郁闷.....

    打表找规律果然是王道.....

  • 0
    @ 2009-08-16 17:41:58

    估计数据改过了..现在不需要高精度了

    来讲讲做法:

    首先打表发现一个规律:ans mod m=m-1 or 0

    令c(x,i)为做x次以后i这个位置是被原来的什么位置替代,f(x)为做x次以后,c(x,i)所组成的序列,比如说M=5,x=5时,c(x,1)=5,c(x,2)=3,c(x,3)=1,c(x,4)=2,c(x,5)=4.f(x)={5,3,1,2,4}.

    再令d(x)表示做x次以后每个硬币的正反情况(1表示反,0表示正),比如m=5,x=5时,d(x)={11100}.

    然后我们发现,f(ans)要么是一个递增序列,要么是一个递降序列,且对于任意的1

  • 0
    @ 2009-07-19 20:31:23

    简单的一个置换群

    f[i]-->f[i]/2 mod (2m+1)

    相反的为

    f[i]:=f[i]*2 mod (2m+1)

    不懂的可以在硬币的反面立一个镜子

    附主函数:

    function find(m:longint):longint;

    var

    i,t,d:longint;

    begin

    if m=1 then exit(2);

    d:=m shl 1+1;

    t:=2;

    i:=1;

    while true do begin

    if t=1 then exit(i*m);

    if t=m shl 1 then exit(i*m-1);

    t:=t shl 1 mod d;

    inc(i);

    end;

    end;

    Orz那些用直接模拟AC的神牛

  • 0
    @ 2009-06-20 21:23:21

    var i:integer;aa,bb:array[1..50000] of integer;a,b,c,d,sum:longint;

    begin

    readln(a);

    b:=b+1;sum:=sum+1;for i:=1 to b do if aa[i]=0 then bb[i]:=1 else bb[i]:=0;

    for i:=b downto 1 do begin d:=d+1; aa[i]:=bb[d]; end;

    for i:=1 to a do if aa[i]=0 then c:=c+1;

    while ca do

    begin

    b:=b+1;sum:=sum+1;d:=0;

    for i:=1 to b do if aa[i]=0 then bb[i]:=1 else bb[i]:=0;

    for i:=b downto 1 do begin d:=d+1; aa[i]:=bb[d]; end;

    if b=a then b:=0;

    c:=0;

    for i:=1 to a do if aa[i]=0 then c:=c+1;

    end;

    writeln(sum);

    end.

    为什么会超时啊???有没有规律啊!

  • 0
    @ 2009-06-10 00:14:06

    绝对高精度

  • 0
    @ 2009-05-05 18:36:42

    m要开到60000

  • 0
    @ 2009-04-23 16:12:55

    数据超范围!!!

  • 0
    @ 2009-04-20 23:15:52

    这题我以前写过一个拿动规写的算法,结果过了9个点,最后一个点超时一点点,估计放到VIJOS能过,有空我发到OIBH上。

  • 0
    @ 2009-02-25 21:50:23

    想法是通过位运算来猥琐的模拟

  • 0
    @ 2009-02-21 16:57:53

    高精度版翻硬币………………

  • 0
    @ 2009-02-11 18:18:13

    m什么时候改成50000的?

  • 0
    @ 2009-02-09 16:53:20

    模拟可以过,不过要加点优化,应该还有更好的方法!

  • 0
    @ 2009-02-09 15:19:51

    题目好象有点问题俄。。

  • 1

信息

ID
1506
难度
7
分类
动态规划 | 组合数学 点击显示
标签
(无)
递交数
326
已通过
62
通过率
19%
被复制
2
上传者