zoukankan      html  css  js  c++  java
  • CodeVS 1697-⑨要写信

    原题

    题目描述 Description

    琪露诺(冰之妖精)有操控冷气的能力。能瞬间冻结小东西,比普通的妖精更危险。一直在释放冷气的她周围总是非常寒冷。

    由于以下三点原因……

    • 琪露诺的符卡 冰符“Icicle Fall”-Easy的弹幕有够蠢的,只要站在她的正前方就没任何弹幕会碰到你;
    • ZUN在《红魔乡》中介绍她时已经说她有点笨笨的了;
    • 在ZUN放出《东方花映冢》的介绍图时,在图中把琪露诺放在了⑨的位置上,并以“⑨笨蛋”简单带过,从此“⑨”及“笨蛋”就成为她的别名了……

    所以琪露诺便得到了“笨蛋”的别称。

    某日,琪露诺又2了……

    她写了N封信要装到N个信封里面,却全都装错了……现在想知道有多少种装错的可能性。

    输入描述 Input Description

    信和信封的数量N。

    输出描述 Output Description

    装错的可能性的数量。

    样例输入 Sample Input

    样例输入1
    2
     
    样例输入2
    4

    样例输出 Sample Output

    样例输出1
    1
     
    样例输出2
    9

    数据范围及提示 Data Size & Hint

    1≤N≤100

     

    题意

    看题面最后一句话,就是求错排数,也就是将N封信全部错装到N个信箱里(不允许有一个是装对的).

    题解

    设N个元素的错排数为f[N],那么f[N-1]就表示N-1个元素的错排数.
    第一步,把第N个元素放在除了N之外的任意一个位置,那么一共就有N-1种方法,假设放的位置是k;
    第二步,将原来位置为k的元素挪至别处,这时有两种情况:
           (1)把它放到位置N,由于第k个元素放到了位置N,那么原先编号为N和编号为k的元素就已经是错位的,那么只需要考虑剩下N-2个元素的错排数,也就是有f[N-2]种方法;
           (2)第k个元素不放到位置N,这时,k就有N-1种方法去放,也可以放到k的位置上,不过一出现这种情况便不合法了,于是有f[N-1]种方法;
     
    所以我们可以得到一个递推式: f[i]=(i-1)*(f[i-2]+f[i-1]) {i>=3}
    还要先确定初始值: f[1]=0,f[2]=1.
    忘了说,这题还要可恶的高精度......  下面代码:
     
     

    uses math;
    var ss:ansistring;
    var f:array[0..1000] of ansistring;
    var n,i:longint;
    function time(s1,s2:ansistring):ansistring;
    var len1,len2,i,j,x,l:longint;
    var a,b,c:array[1..100000] of longint;
    var ss:string;
    begin
      len1:=length(s1);len2:=length(s2);ss:='';
      fillchar(a,sizeof(a),0);fillchar(b,sizeof(b),0);fillchar(c,sizeof(c),0);
      for i:=1 to len1 do a[len1-i+1]:=ord(s1[i])-48;
      for i:=1 to len2 do b[len2-i+1]:=ord(s2[i])-48;
      for i:=1 to len1 do
      for j:=1 to len2 do
      begin
        c[i+j-1]:=c[i+j-1]+a[i]*b[j];
        c[i+j]:=c[i+j]+c[i+j-1] div 10;
        c[i+j-1]:=c[i+j-1] mod 10;
      end;
      for i:=len1+len2 downto 1 do if c[i]<>0 then begin l:=i;break; end;
      for i:=l downto 1 do ss:=ss+chr(c[i]+48);
      exit(ss);
    end;
    function add(s1,s2:ansistring):ansistring;
    var len1,len2,i,x,l:longint;
    var a,b,c:array[1..10000] of longint;
    var ss,p:string;
    begin
      len1:=length(s1);len2:=length(s2);ss:='';p:='';
      fillchar(a,sizeof(a),0);fillchar(b,sizeof(b),0);
      for i:=1 to len1 do a[len1-i+1]:=ord(s1[i])-48;
      for i:=1 to len2 do b[len2-i+1]:=ord(s2[i])-48;
      i:=0;x:=0;
      for i:=1 to max(len1,len2) do
      begin
        x:=x+a[i]+b[i];
        c[i]:=x mod 10;
        x:=x div 10;
      end;
      if x>0 then begin l:=i+1;c[l]:=1; end else l:=i;
      for i:=l downto 1 do ss:=ss+chr(c[i]+48);
      exit(ss);
    end;
    begin
      readln(n);
      if n=1 then begin writeln(0);halt; end;
      if n=2 then begin writeln(1);halt; end;
      f[1]:='0';f[2]:='1';
      for i:=3 to n do
      begin
        str(i-1,ss);
        f[i]:=time(ss,add(f[i-1],f[i-2]));
      end;
      writeln(f[n]);
    end.

     

     

    欢迎转载,若转载请注明出处.

     

     

  • 相关阅读:
    STM32启动BOOT0 BOOT1设置方法
    端口映射
    端口映射
    静态路由配置
    静态路由配置
    NETGEAR路由器登录不上 重新获取ip
    NETGEAR路由器登录不上 重新获取ip
    GSM AT指令 SIM900A TC35
    GSM AT指令 SIM900A TC35
    TTP223 触摸按键
  • 原文地址:https://www.cnblogs.com/HAdolf-HQY/p/6493036.html
Copyright © 2011-2022 走看看