题解

70 条题解

  • 0
    @ 2009-08-15 21:29:49

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 0ms

    ├ 测试数据 10:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    公式+高精=秒杀

    高精的组合可以先约分再高精乘就避免高精除了..

    不过写起来挺麻烦...

  • 0
    @ 2009-08-05 16:37:49

    9 30000这个点我的程序在我家的机子上足足跑了4秒,可是……

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 0ms

    ├ 测试数据 10:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    是Vijos评测器太牛X还是数据太弱?

  • 0
    @ 2009-08-03 18:09:39

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 103ms

    ├ 测试数据 10:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:103ms

    高精+递推 恩...注意下最高位的情况就好了 米有秒杀 惭愧...

    {main} {高精就不打了哈...}

    begin

    readln(k,w);

    k2:=1;

    for i:=1 to k do k2:=k2*2;

    pp:=w mod k;{zui gao wei}

    qq:=w div k;{zui shao wei shu}

    case pp of

    0:r:=0;

    1:r:=1;

    2:r:=3;

    3:r:=7;

    4:r:=15;

    5:r:=31;

    6:r:=63;

    7:r:=127;

    8:r:=255;

    end;{zui gao wei zui da shu}

    for i:=1 to k2 do begin f[1,i][0]:=1;f[1,i][1]:=1;end;

    for i:=2 to qq do

    for j:=k2-2 downto 1 do

    begin

    add(f,f);{add是把后者加到前者里}

    add(f,f);

    add(ans,f);

    end;

    if pp0 then begin

    for j:=k2-2 downto 1 do

    begin

    add(f[qq+1,j],f[qq,j+1]);

    add(f[qq+1,j],f[qq+1,j+1]);

    end;

    for j:=r downto 1 do

    add(ans,f[qq+1,j]);

    end;

    {print}

    for i:=ans[0] downto 1 do

    write(ans[i]);

    writeln;

    end.

  • 0
    @ 2009-07-28 11:31:43

    type

    arr =array[0..40]of longint;

    var

    k,w,s,p,i,q :longint;

    tot :arr;

    function he(x,y:arr):arr;

    var

    z:arr;

    q,jin,i :longint;

    begin

    if x[0]>y[0] then

    begin

    q:=y[0];

    z:=x;

    end

    else

    begin

    q:=x[0];

    z:=y;

    end;

    jin:=0;

    for i:=1 to q do

    begin

    z[i]:=x[i]+y[i]+jin;

    jin:=z[i] div 1000000;

    z[i]:=z[i]mod 1000000;

    end;

    if jin>0 then

    begin

    for i:=q+1 to z[0] do

    begin

    z[i]:=z[i]+jin;

    jin:=z[i]div 1000000;

    if jin=0 then break;

    end;

    if jin>0 then

    begin

    inc(z[0]);

    z[z[0]]:=jin;

    end;

    end;

    exit(z);

    end;

    function shang(q:arr;k:longint):arr;

    var

    jin,i :longint;

    z :arr;

    begin

    jin:=0;

    for i:=q[0] downto 1 do

    begin

    z[i]:=jin*1000000+q[i];

    jin:=z[i] mod k;

    z[i]:=z[i]div k;

    end;

    for i:=q[0] downto 1 do

    if z[i]>0 then

    begin

    z[0]:=i;

    break;

    end;

    exit(z);

    end;

    function ji(x:arr;k:longint):arr;

    var

    jin,i :longint;

    z :arr;

    begin

    jin:=0;

    z[0]:=x[0];

    for i:=1 to x[0] do

    begin

    z[i]:=x[i]*k+jin;

    jin:=z[i]div 1000000;

    z[i]:=z[i]mod 1000000;

    end;

    if jin>0 then

    begin

    inc(z[0]);

    z[z[0]]:=jin;

    end;

    exit(z);

    end;

    procedure print(x:arr);

    var

    i :longint;

    st :string;

    begin

    write(x[x[0]]);

    for i:=x[0]-1 downto 1 do

    begin

    str(x[i],st);

    while length(st)1 shl k then q:=1 shl k-s-1 else q:=1 shl p-1;

    for i:=q downto 1 do

    tot:=he(tot,c(s,1 shl k-1-i));

    for i:=s downto 2 do

    tot:=he(tot,c(i,1 shl k-1));

    print(tot);

    end.

  • 0
    @ 2009-07-06 22:12:09

    type arr=array[0..200]of longint;

    var f:arr;

    function chu(a:arr; b:longint):arr;

    var c:arr; i,s:longint;

    begin

    fillchar(c,sizeof(c),0);

    s:=0;

    for i:=a[0] downto 1 do

    begin

    s:=s*10+a[i];

    if s>=b then

    begin

    c[i]:=s div b;

    s:=s mod b;

    end

    else c[i]:=0;

    end;

    c[0]:=a[0];

    while c[c[0]]=0 do dec(c[0]);

    exit(c);

    end;

    function cheng(a:arr; b:longint):arr;

    var c:arr; i:longint;

    begin

    fillchar(c,sizeof(c),0);

    for i:=1 to a[0] do

    begin

    inc(c[i],a[i]*b);

    inc(c,c[i] div 10);

    c[i]:=c[i] mod 10;

    end;

    c[0]:=a[0];

    while c[c[0]+1]>0 do

    begin

    c[c[0]+2]:=c[c[0]+1] div 10;

    c[c[0]+1]:=c[c[0]+1] mod 10;

    inc(c[0]);

    end;

    exit(c);

    end;

    function try(n,m:longint):arr;

    var a:arr; i:longint;

    begin

    fillchar(a,sizeof(a),0);

    a[0]:=1; a[1]:=1;

    if m=n then exit(a);

    fillchar(a,sizeof(a),0);

    if m>n div 2 then m:=n-m;

    a[1]:=n; a[0]:=1;

    for i:=n-1 downto n-m+1 do

    begin

    a:=cheng(a,i);

    a:=chu(a,n-i+1);

    end;

    exit(a);

    end;

    function add(a,b:arr):arr;

    var c:arr; i:longint;

    begin

    fillchar(c,sizeof(c),0);

    if a[0]1) do dec(c[0]);

    exit(c);

    end;

    procedure out;

    var i:longint;

    begin

    for i:=f[0] downto 1 do write(f[i]);

    writeln;

    end;

    procedure main;

    var n,m,k,w,s,ss,i:longint; tmp:arr;

    begin

    readln(k,w);

    n:=w div k;

    m:=w mod k;

    s:=1;

    for i:=1 to k do s:=s*2;

    dec(s);

    if n>=s then

    begin

    n:=s;

    m:=0;

    end;

    fillchar(f,sizeof(f),0);

    for i:=2 to n do

    begin

    tmp:=try(s,i);

    f:=add(f,tmp);

    end;

    ss:=1;

    if m0 then

    begin

    for i:=1 to m do ss:=ss*2;

    dec(ss);

    for i:=1 to ss do

    if s-i>=n then

    begin

    tmp:=try(s-i,n);

    f:=add(f,tmp);

    end;

    end;

    end;

    begin

    main;

    out;

    end.

  • 0
    @ 2009-05-26 12:33:49

    设m=w div k,c=w mod k

    答案为

    sigma(C(2^k-1,i)) |2

  • 0
    @ 2009-03-07 20:10:14

    我用数论。。。。组合

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 571ms

    ├ 测试数据 10:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:571ms

    高精仔细!!SO EASY

  • 0
    @ 2009-02-28 20:55:51

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案错误... ├ 标准行输出

     ├ 错误行输出

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 0ms

    ├ 测试数据 10:答案正确... 0ms

  • 0
    @ 2009-02-17 22:34:32

    动态规划+高精度.

    动态规划不难,但是高精度就要注意细节了!

  • 0
    @ 2008-12-15 23:41:07

    好诡异.......第6个点没过......

    WHY?

    方法与楼下基本相同,

    f表示后i位(指转化成2^k进制后的),第i位为j的总数

    f:=f+f

    注意定义j的范围和初始化:

    f[1,j]:=f[1,j+1]+1;

    我用了一个二维DP,为了缩小数组,

    只是用了二维的数组,写了一个我都恶心得受不了的程序

    可是.........

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案错误... ├ 标准行输出

     ├ 错误行输出

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 0ms

    ├ 测试数据 10:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Unaccepted 有效得分:90 有效耗时:0ms

    var

    a:array[1..512,0..200] of longint;

    b:array[0..200] of longint;

    n,i,j,k,x,s,t,v:longint;

    f:boolean;

    begin

    readln(k,n);

    x:=n mod k;t:=1;

    for i:=1 to x do

    t:=t*2;

    t:=t-1;

    x:=n div k;

    s:=1;

    for i:=1 to k do

    s:=s*2;

    f:=true;

    if x>=s then begin

    t:=s-1;f:=false;

    end;

    for i:=1 to s-1 do begin

    a:=1;a:=1;end;

    for i:=2 to x do

    begin

    for j:=0 to 200 do a[1,j]:=0;

    for j:=2 to s-i+1 do

    begin

    if a[1,0]>a[j,0]

    then v:=a[1,0] else v:=a[j,0];

    for k:=1 to v do begin

    a[1,k]:=a[1,k]+a[j,k];

    if a[1,k]>=10 then begin

    a[1,k+1]:=a[1,k+1]+a[1,k] div 10;

    a[1,k]:=a[1,k] mod 10;

    if k+1>v then a[1,0]:=k+1;

    end;

    end;

    if v>a[1,0] then a[1,0]:=v;

    end;j:=1;

    for k:=1 to a[j,0] do

    begin

    b[k]:=b[k]+a[j,k];

    if b[k]>=10 then begin

    b[k+1]:=b[k+1]+b[k] div 10;

    b[k]:=b[k] mod 10;

    end;end;

    for j:=2 to s-i+1 do

    begin

    for k:=1 to a[j-1,0] do

    begin

    a[j,k]:=a[j-1,k]-a[j,k];

    if a[j,k]=10 then begin

    b[k+1]:=b[k+1]+b[k] div 10;

    b[k]:=b[k] mod 10;

    end;end;

    end;

    end;

    for j:=0 to 200 do a[1,j]:=0;

    if t>0 then

    for j:=2 to s-i do

    begin

    if a[1,0]>a[j,0]

    then v:=a[1,0] else v:=a[j,0];

    for k:=1 to v do begin

    a[1,k]:=a[1,k]+a[j,k];

    if a[1,k]>=10 then begin

    a[1,k+1]:=a[1,k+1]+a[1,k] div 10;

    a[1,k]:=a[1,k] mod 10;

    if k+1>v then a[1,0]:=k+1;

    end;

    end;

    end;

    if v>a[1,0] then a[1,0]:=v;

    j:=1;

    for k:=1 to a[j,0] do

    begin

    b[k]:=b[k]+a[j,k];

    if b[k]>=10 then begin

    b[k+1]:=b[k+1]+b[k] div 10;

    b[k]:=b[k] mod 10;

    end;end;

    for j:=2 to t do

    begin

    for k:=1 to a[j-1,0] do

    begin

    a[j,k]:=a[j-1,k]-a[j,k];

    if a[j,k]=10 then begin

    b[k+1]:=b[k+1]+b[k] div 10;

    b[k]:=b[k] mod 10;

    end;

    end;

    end;

    for i:=1 to 200 do

    if b[i]>=10 then begin

    b:=b+b[i] div 10;

    b[i]:=b[i] mod 10;

    end;

    for i:=200 downto 1 do

    if b[i]0 then break;

    for j:=i downto 1 do

    write(b[j]);

    writeln;

    end.

    55555555.....最近做什么题都不对 - -!!!!

  • 0
    @ 2008-11-11 07:34:08

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 0ms

    ├ 测试数据 10:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    方程:

    f表示后i位(指转化成2^k进制后的),第i位为j的总数

    f:=f+f

    注意定义j的范围和初始化:

    f[1,j]:=f[1,j+1]+1;

  • 0
    @ 2008-11-08 14:40:28

    program digital;

    var

    k3,first,changdu,len,n,k,w,i,j,k2,jinwei,p,temp:integer;

    ans,d,zhs,b,c:array[0..10000]of integer;

    procedure zuhe(n,k:integer);

    var

    i1,o:integer;

    begin

    zhs[1]:=1;

    changdu:=1;

    for i:=(n-k)+1 to n do

    begin

    b[i]:=i;

    end;

    j:=n-k+1;

    i:=2;

    for i:=2 to k do

    begin

    c[i]:=i;

    end;

    for i:=2 to k do

    begin

    j:=n-k+1;

    while c[i]1 do

    begin

    i1:=2;

    while i1=10 then

    begin

    jinwei:=zhs[o] div 10;

    zhs[o]:=zhs[o] mod 10;

    end;

    end;

    if jinwei0 then

    begin

    while jinwei0 do

    begin

    inc(changdu);

    zhs[changdu]:=jinwei mod 10;

    jinwei:=jinwei div 10

    end;

    end;

    end;

    end;

    procedure gaojinjia;

    var

    i,j,k:integer;

    begin

    for i:=1 to changdu do

    begin

    ans[i]:=ans[i]+zhs[i]+jinwei;

    jinwei:=0;

    if ans[i]>=10 then

    begin

    jinwei:=ans[i] div 10;

    ans[i]:=ans[i] mod 10;

    end;

    end;

    while jinwei0 do

    begin

    inc(i);

    ans[i]:=ans[i]+jinwei;

    jinwei:=0;

    if ans[i]>=10 then

    begin

    jinwei:=ans[i] div 10;

    ans[i]:=ans[i] mod 10;

    end;

    if changdu+1>len then

    len:=changdu+1

    end;

    if changdu>len then

    len:=changdu;

    end;

    begin

    read(k,w);

    k2:=1;

    for i:=1 to k do

    begin

    k2:=k2*2;

    end;

    if w div k >k2 then

    temp:=k2-1

    else

    temp:=w div k;

    if (w mod k=0)or(w div k>k2-1) then

    begin

    for p:=2 to temp do

    begin

    zhs[1]:=1;

    changdu:=1;

    if k2-1>=p then

    zuhe(k2-1,p)

    else

    break;

    gaojinjia;

    fillchar(zhs,sizeof(zhs),0);

    fillchar(c,sizeof(c),0);

    fillchar(b,sizeof(b),0);

    end;

    end

    else

    begin

    first:=w mod k ;

    if w div k >k2 then

    temp:=k2-1

    else

    temp:=w div k;

    for p:=2 to temp do

    begin

    zhs[1]:=1;

    changdu:=1;

    if k2-1>=p then

    zuhe(k2-1,p)

    else

    break;

    gaojinjia;

    fillchar(zhs,sizeof(zhs),0);

    fillchar(c,sizeof(c),0);

    fillchar(b,sizeof(b),0);

    end;

    k3:=1;

    for p:=1 to first do

    begin

    k3:=k3*2;

    end;

    dec(k3);

    for p:=1 to k3 do

    begin

    zhs[1]:=1;

    changdu:=1;

    if (k2-1-p)>=(w div k) then

    zuhe(k2-1-p,w div k)

    else

    break;

    gaojinjia;

    fillchar(zhs,sizeof(zhs),0);

    fillchar(c,sizeof(c),0);

    fillchar(b,sizeof(b),0);

    end;

    end;

    for i:=len downto 1 do

    begin

    write(ans[i]);

    end;

    end.

    写的好丑...而且.

    哎...

    哪位大牛帮我看看吧...

  • 0
    @ 2008-11-06 12:30:04

    先用 c:=c+c 推出 c[1 shl k,w div k];

    再计算,程序只有40+行,而且0ms.

  • 0
    @ 2008-11-02 13:52:48

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 9ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 87ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 321ms

    ├ 测试数据 09:答案正确... 633ms

    ├ 测试数据 10:答案正确... 0ms

  • 0
    @ 2008-11-02 11:19:50

    测评机又不稳定了

    01和09换着TLE

    更搞笑的是

    Flag

      Accepted

  • 0
    @ 2008-10-31 21:34:27

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 0ms

    ├ 测试数据 10:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    f[i][j]=f[i][j+1]+f[j+1]

  • 0
    @ 2008-10-29 18:58:20

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 118ms

    ├ 测试数据 10:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:118ms

    很水的动规,加了个高精就wa了一大片

  • 0
    @ 2008-10-27 22:34:40

    很想bs vj的评测系统。为什么我写0 then inc(len);

    add[0]:=len;

    end;

    function minus(a,b:arr):arr;

    var i,j:longint;

    begin

    fillchar(minus,sizeof(minus),0);

    minus[0]:=a[0];

    for i:=1 to minus[0] do

    begin

    if a[i]0)and(minus[minus[0]]=0) do dec(minus[0]);

    end;

    begin

    readln(k,w);

    n:=1 shl k-1; m:=w div k;

    c:=false;

    for i:=1 to n-1 do

    begin f[c,i,0]:=1; f[c,i,1]:=n-i; ans:=add(ans,f[c,i]); end;

    for i:=3 to m do

    begin

    c:=not c; fillchar(f[c],sizeof(f[c]),0);

    for j:=2 to n-i+2 do

    f[c,1]:=add(f[c,1],f[not c,j]);

    ans:=add(ans,f[c,1]);

    for j:=2 to n-i+1 do

    begin

    f[c,j]:=minus(f[c,j-1],f[not c,j]);

    ans:=add(ans,f[c,j]);

    end;

    end;

    m:=w mod k;

    if m0 then

    begin

    c:=not c; fillchar(f[c],sizeof(f[c]),0);

    for j:=2 to n-w div k+1 do f[c,1]:=add(f[c,1],f[not c,j]);

    ans:=add(ans,f[c,1]);

    for j:=2 to 1 shl m-1 do

    begin

    f[c,j]:=minus(f[c,j-1],f[not c,j]);

    ans:=add(ans,f[c,j]);

    end;

    end;

    write(ans[ans[0]]);

    for i:=ans[0]-1 downto 1 do

    case ans[i] of

    0..9:write('000',ans[i]);

    10..99:write('00',ans[i]);

    100..999:write('0',ans[i]);

    else write(ans[i]);

    end;

    writeln;

    end.

    这不是代码

  • 0
    @ 2008-10-22 11:59:52

    附上程序供您参考

    #include

    #include

    #include

    #define maxlen 2000

    #define maxcase 2000

    long k,w,ans[maxlen+10],r_c[maxlen+10];

    void num_plus_be_num(long *c,long *a)

    {

    long i,len;

    len=(c[0]>a[0])?c[0]:a[0];

    for(i=1;i=2;--i)

    {

    v=i;

    for(j=0;j

信息

ID
1315
难度
5
分类
组合数学 | 数论 点击显示
标签
递交数
1417
已通过
518
通过率
37%
被复制
13
上传者