题解

33 条题解

  • 1
    @ 2022-07-20 15:28:34
    program exam;
    var m,n,k,l,xx,x,s,x1,x2,d:int64;
    i,j,jj:longint;
    a,c:array[0..10000] of longint;
    
    function pd(a,p,t:int64):int64;
    var i,j,k,q:int64;
    begin
    q:=p;
    k:=a;
    pd:=1;
    while q>0 do
    begin
    if q and 1>0 then
    pd:=pd*k mod t;
    k:=k*k mod t;
    q:=q shr 1;
    end;
    end;
    
    begin
    readln(k,x);
    xx:=1;
    a[1]:=1;
    s:=pd(x,x,1000);
    for i:=s-k+1 to s-1 do
    begin
    x1:=i;
    xx:=0;
    for j:=1 to 10000 do
    begin
    a[j]:=a[j]*x1+xx;
    xx:=a[j] div 10;
    a[j]:=a[j] mod 10;
    end;
    while xx>0 do
    begin
    inc(j);
    a[j]:=xx mod 10;
    xx:=xx div 10;
    end;
    x2:=i+k-s;
    for jj:=10000 downto 1 do
    begin
    c[jj]:=(a[jj]) div x2;
    if jj>1 then
    a[jj-1]:=a[jj-1]+a[jj] mod x2*10;
    end;
    a:=c;
    end;
    l:=10000;
    while (a[l]=0) and (l>0) do dec(l);
    for i:=l downto 1 do
    write(a[i]);
    end.
    
  • 0
    @ 2016-10-02 20:13:49

    就是求C(g(x)-1,k-1),很容易推,就是用板隔球
    两种方法:
    第一种可以用杨辉三角(或者组合恒等式)
    第二种可以直接求,边乘边约分
    无论哪种,都需要快速幂+高精度,别天真地用LL了。。。

  • 0
    @ 2016-05-22 09:52:44

    type tt=array [0..50005] of longint;
    var
    a,b,c:tt;
    k,p,n,m,i,l1,l2,l3:longint;
    procedure cch;
    var i,j,x:longint;
    begin
    fillchar(c,sizeof(c),0);
    for i:=1 to l1 do
    begin
    x:=0;
    for j:=1 to l2 do
    begin
    x:=x+a[i]*b[j]+c[i+j-1];
    c[i+j-1]:=x mod 10;
    x:=x div 10;
    end;
    c[i+l2]:=x;
    end;
    if (c[l1+l2]<>0) then l3:=l1+l2 else l3:=l1+l2-1;
    end;
    procedure jy(t:longint);
    var i,x:longint;
    begin
    fillchar(b,sizeof(b),0);
    x:=0;
    for i:=l1 downto 1 do
    begin
    x:=x*10+a[i];
    b[i]:=x div t;
    x:=x mod t;
    end;
    l2:=l1;
    while (b[l2]=0) and (l2>1) do dec(l2);
    end;
    procedure fj(x:longint);
    var i:longint;
    begin
    fillchar(b,sizeof(b),0);
    i:=0;
    while (x<>0) do
    begin inc(i); b[i]:=x mod 10; x:=x div 10; end;
    l2:=i;
    end;
    procedure jzq(a:tt; l:longint);
    var i:longint;
    begin
    for i:=l downto 1 do write(a[i]);
    writeln;
    end;
    function cky(x,y:longint):longint;
    begin
    if (y=1) then exit(x);
    if (y mod 2=0) then exit(sqr(cky(x,y div 2)) mod 1000)
    else exit(sqr(cky(x,y div 2))*x mod 1000);
    end;
    begin
    read(k,p);
    n:=cky(p mod 1000,p)-1;
    m:=k-1;
    a[1]:=1; l1:=1;
    for i:=n-m+1 to n do
    begin fj(i); cch; l1:=l3; a:=c; end;
    for i:=2 to m do
    begin jy(i); a:=b; l1:=l2; end;
    jzq(a,l1);
    end.

  • 0
    @ 2015-10-16 20:45:05

    program exam;
    var m,n,k,l,xx,x,s,x1,x2,d:int64;
    i,j,jj:longint;
    a,c:array[0..10000] of longint;

    function pd(a,p,t:int64):int64;
    var i,j,k,q:int64;
    begin
    q:=p;
    k:=a;
    pd:=1;
    while q>0 do
    begin
    if q and 1>0 then
    pd:=pd*k mod t;
    k:=k*k mod t;
    q:=q shr 1;
    end;
    end;

    begin
    readln(k,x);
    xx:=1;
    a[1]:=1;
    s:=pd(x,x,1000);
    for i:=s-k+1 to s-1 do
    begin
    x1:=i;
    xx:=0;
    for j:=1 to 10000 do
    begin
    a[j]:=a[j]*x1+xx;
    xx:=a[j] div 10;
    a[j]:=a[j] mod 10;
    end;
    while xx>0 do
    begin
    inc(j);
    a[j]:=xx mod 10;
    xx:=xx div 10;
    end;
    x2:=i+k-s;
    for jj:=10000 downto 1 do
    begin
    c[jj]:=(a[jj]) div x2;
    if jj>1 then
    a[jj-1]:=a[jj-1]+a[jj] mod x2*10;
    end;
    a:=c;
    end;
    l:=10000;
    while (a[l]=0) and (l>0) do dec(l);
    for i:=l downto 1 do
    write(a[i]);
    end.

  • 0
    @ 2015-10-16 20:26:09

    program aa;
    var
    i,j,k,l,n,m,g,h:longint;
    ans,tot,ii,jj,kk,ll:int64;
    a,b,c:array[0..10000]of longint;
    procedure moo(x,y,z:longint);
    var
    i,j:longint; k,l,g:int64;
    begin
    k:=x;
    l:=y;
    ans:=1;
    while l>0 do
    begin
    if l and 1=1 then
    ans:=(ans*k)mod z;
    k:=((k mod z)*(k mod z))mod z;
    l:=l div 2;
    end;
    end;

    begin
    readln(k,n);
    moo(n,n,1000);
    dec(k);
    dec(ans);
    a[1]:=1; a[0]:=1;
    tot:=1;
    for g:=ans downto ans-k+1 do
    begin
    ii:=0;
    for i:=1 to a[0] do
    begin
    a[i]:=a[i]*g+ii;
    ii:=a[i] div 10;
    a[i]:=a[i] mod 10;
    end;
    while ii>0 do
    begin
    inc(a[0]);
    a[a[0]]:=ii mod 10;
    ii:=ii div 10;
    end;
    while (a[a[0]]=0)and(a[0]>0) do dec(a[0]);
    end;
    c[0]:=a[0];
    for g:=k downto 2 do
    begin
    ii:=0;
    for i:=a[0] downto 1 do
    begin
    c[i]:=(ii*10+a[i]) div g;
    ii:=(ii*10+a[i]) mod g;
    end;
    if ii<>0 then a[1]:=a[1]+ii;
    while (c[c[0]]=0)and(c[0]>0) do dec(c[0]);
    a:=c;
    end;
    for i:=c[0] downto 1 do
    write(c[i]);
    writeln;
    end.

  • 0
    @ 2009-11-01 16:39:01

    编译通过...

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

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

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

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

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

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

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

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

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

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

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

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

    快速幂+高精

  • 0
    @ 2009-10-11 16:26:54

    编译通过...

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

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

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

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

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

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

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

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

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

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

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

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

    一次AC 爽

    先x快速幂 快速幂似乎写成递归的要好写一些 反正才maxlongint只有31层

    快速幂骨架:

    function g(x:longint):longint;

    begin

    if x=1 then

    exit(m);

    g:=g(x shr 1)*g(x shr 1) mod 1000;

    if x and 1=1 then

    g:=g*m mod 1000;

    end;

    然后把A1,A2,A3...AK看成K个盒子 就变成X个球放到K个盒子里的方案数

    就是在X-1个空里插K-1个板 因为要正整数解,所以答案就是C(g(x)-1,k-1)

    高精即可【筛求1000内素数 然后上下分解质因子相减 最后乘起来】 不用压位

  • 0
    @ 2009-10-01 21:08:50

    快速幂取模的代码

    function quickpower(c,d:int64):longint;

    var ans:int64;

    begin

    ans:=1;

    while d>0 do

    begin

    if d and 1=1 then ans:=ans*c mod 1000;

    c:=c*c mod 1000;

    d:=d shr 1;

    end;

    exit(ans);

    end;

  • 0
    @ 2009-08-14 11:07:09

    g(x)=x^x mod 1000 我居然把它当成平方,害我错了N次,这题就是排列组合+快速幂

  • 0
    @ 2009-07-30 18:06:44

    快速幂+dp+高精度+树状数组

    程序写得十分猥琐,勉强过了,早知道想个公式套上,不知会好多少

  • 0
    @ 2009-06-18 18:36:00

    第101个……

    第一问快速幂,第二问简单DP+小优化……

    要用高精度!!!!!!!!!!!!!!!!!!!!

  • 0
    @ 2009-06-13 23:39:28

    Flag   Accepted

    题号   P1371

    类型(?)   数论 / 数值

    通过   100人

    提交   322次

    通过率   31%

    难度   2

    呼,赶上末班车了。。。。。。

  • 0
    @ 2009-05-03 12:48:33

    编译通过...

    ├ 测试数据 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-04-17 22:29:44

    综合题..

  • 0
    @ 2009-02-04 09:57:03

    编译通过...

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

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

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

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

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

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

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

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

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

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

    我没考虑任何情况,只在开始加了x:=x mod 1000;-次ac!!

  • 0
    @ 2008-11-06 09:41:23

    显然是(x^x) mod 1000

    别听楼上胡扯

  • 0
    @ 2008-10-14 20:43:11

    请问

    g(x)需要高精吗

    是(x^x)mod 1000还是x^(x mod 1000)

    经过实验是x^(x mod 1000)

    且若mod=0则g(x)=1000

    编译通过...

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

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

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

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

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

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

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

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

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

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

  • 0
    @ 2008-10-03 23:27:57

    orz潇牛

    倍增+万进制高精+inline

    都能37行

  • 0
    @ 2008-09-24 13:30:37

    37行,0msAC

    倍增+万进制高精+inline

    Ans=C(g(x)-1,k-1)

  • 0
    @ 2008-09-17 13:57:10

    嗯。。简单的题一定WS。。

    算x^n时要么用int64,要么一开始就x=x mod 1000,否则会爆掉

信息

ID
1371
难度
6
分类
组合数学 点击显示
标签
递交数
443
已通过
126
通过率
28%
被复制
3
上传者