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.

忘了说,这题还要可恶的高精度......  下面代码:

 1 uses math;
 2 var ss:ansistring;
 3 var f:array[0..1000] of ansistring;
 4 var n,i:longint;
 5 function time(s1,s2:ansistring):ansistring;//高精度乘法
 6 var len1,len2,i,j,x,l:longint;
 7 var a,b,c:array[1..100000] of longint;
 8 var ss:string;
 9 begin
10   len1:=length(s1);len2:=length(s2);ss:=‘‘;
11   fillchar(a,sizeof(a),0);fillchar(b,sizeof(b),0);fillchar(c,sizeof(c),0);
12   for i:=1 to len1 do a[len1-i+1]:=ord(s1[i])-48;
13   for i:=1 to len2 do b[len2-i+1]:=ord(s2[i])-48;
14   for i:=1 to len1 do
15   for j:=1 to len2 do
16   begin
17     c[i+j-1]:=c[i+j-1]+a[i]*b[j];
18     c[i+j]:=c[i+j]+c[i+j-1] div 10;
19     c[i+j-1]:=c[i+j-1] mod 10;
20   end;
21   for i:=len1+len2 downto 1 do if c[i]<>0 then begin l:=i;break; end;
22   for i:=l downto 1 do ss:=ss+chr(c[i]+48);
23   exit(ss);
24 end;
25 function add(s1,s2:ansistring):ansistring;//高精度加法
26 var len1,len2,i,x,l:longint;
27 var a,b,c:array[1..10000] of longint;
28 var ss,p:string;
29 begin
30   len1:=length(s1);len2:=length(s2);ss:=‘‘;p:=‘‘;
31   fillchar(a,sizeof(a),0);fillchar(b,sizeof(b),0);
32   for i:=1 to len1 do a[len1-i+1]:=ord(s1[i])-48;
33   for i:=1 to len2 do b[len2-i+1]:=ord(s2[i])-48;
34   i:=0;x:=0;
35   for i:=1 to max(len1,len2) do
36   begin
37     x:=x+a[i]+b[i];
38     c[i]:=x mod 10;
39     x:=x div 10;
40   end;
41   if x>0 then begin l:=i+1;c[l]:=1; end else l:=i;
42   for i:=l downto 1 do ss:=ss+chr(c[i]+48);
43   exit(ss);
44 end;
45 begin
46   readln(n);
47   if n=1 then begin writeln(0);halt; end;
48   if n=2 then begin writeln(1);halt; end;
49   f[1]:=‘0‘;f[2]:=‘1‘;//定初值
50   for i:=3 to n do
51   begin
52     str(i-1,ss);
53     f[i]:=time(ss,add(f[i-1],f[i-2]));//递推式
54   end;
55   writeln(f[n]);
56 end.

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

时间: 2024-10-19 11:47:01

CodeVS 1697-⑨要写信的相关文章

wikioi 1697 ⑨要写信

把n个元素的错排数记为Dn,显然D1=0,D2=1.当n≥3时,设不错排时i位置的元素为a[i],不妨设最后一个数a[n]排在了第k位,其中k≠n,也就是1≤k≤n-1.那么我们现在考虑第n位的情况. 当a[k]排在第n位时,a[n]与a[k]的位置均已确定,除了a[n]和a[k]以外还有n-2个数,其错排数为Dn-2. 当a[k]不排在第n位时,只有a[n]的位置确定(占据了k位置),那么这时的包括a[k]在内的剩下n-1个数的每一种错排,都等价于只有n-1个数时的错排(因为已经假设a[k]不

⑨要写信(codevs 1697)

题目描述 Description 琪露诺(冰之妖精)有操控冷气的能力.能瞬间冻结小东西,比普通的妖精更危险.一直在释放冷气的她周围总是非常寒冷. 由于以下三点原因…… 琪露诺的符卡 冰符“Icicle Fall”-Easy的弹幕有够蠢的,只要站在她的正前方就没任何弹幕会碰到你: ZUN在<红魔乡>中介绍她时已经说她有点笨笨的了: 在ZUN放出<东方花映冢>的介绍图时,在图中把琪露诺放在了⑨的位置上,并以“⑨笨蛋”简单带过,从此“⑨”及“笨蛋”就成为她的别名了…… 所以琪露诺便得到了

1697 ⑨要写信

  时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 琪露诺(冰之妖精)有操控冷气的能力.能瞬间冻结小东西,比普通的妖精更危险.一直在释放冷气的她周围总是非常寒冷. 由于以下三点原因…… 琪露诺的符卡 冰符“Icicle Fall”-Easy的弹幕有够蠢的,只要站在她的正前方就没任何弹幕会碰到你: ZUN在<红魔乡>中介绍她时已经说她有点笨笨的了: 在ZUN放出<东方花映冢>的介绍图时,在图中把琪

⑨要写信

1697 ⑨要写信 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 琪露诺(冰之妖精)有操控冷气的能力.能瞬间冻结小东西,比普通的妖精更危险.一直在释放冷气的她周围总是非常寒冷. 由于以下三点原因…… 琪露诺的符卡 冰符“Icicle Fall”-Easy的弹幕有够蠢的,只要站在她的正前方就没任何弹幕会碰到你: ZUN在<红魔乡>中介绍她时已经说她有点笨笨的了: 在ZUN放出<东方花映冢>的介绍图时,在图中把琪露诺

0709模拟题

7.9模拟比赛 注:本场考试3道题,时间3个小时.全部为codevs上的题目 1.2124 美丽的大树 题目描述 Description 平江路是苏州最美丽的道路,路中间的绿化带上种了两行漂亮的大树,每行50棵,一共100棵大树,这些大树被编上了号,编号方式如下: 1 3 5 7 ………… 45 47 49 …………99     第一行 2 4 6 8 ………… 46 48 50 …………100    第二行 但是昨天晚上却发生了一件令人震惊的大事--可恶的破坏分子竟然偷去了这100棵大树中的一

[ CodeVS冲杯之路 ] P2492

不充钱,你怎么AC? 题目:http://codevs.cn/problem/2492/ 在此先orz小胖子,教我怎么路径压缩链表,那么这样就可以在任意节点跳进链表啦(手动@LCF) 对于查询操作,直接树状数组(以下简称BIT)维护,修改操作就一个个暴力开方搞,再用差值单点更新BIT 不过这样会TLE,要加一点优化对不对,正如开头所说的路径压缩链表 路径压缩链表其实就是个并查集,在普通的链表里,删去两个连续的节点后会是下面这种情况,如删去2,3 当访问 2 的时候,会跳到3,但 3 已经删除了,

[CODEVS 1281] Xn数列

描述 给你6个数,m, a, c, x0, n, g Xn+1 = ( aXn + c ) mod m,求Xn http://codevs.cn/problem/1281/ 分析 比较裸的矩阵乘法题, 好久没做了, 写写思路 假设矩阵 A = { {a1, a2}, {a3, a4} }, B = { {b1, b2}, {b3, b4} }. 根据矩阵乘法的计算方法, 有 : A×B = { {a1b1+a2b2, a1b2+a2b4}, {a3b1+a4b3, a3b2+a4b4} }. 那

Codevs 1257 打砖块

1257 打砖块 http://codevs.cn/problem/1257/ 题目描述 Description 在一个凹槽中放置了n层砖块,最上面的一层有n块砖,第二层有n-1块,……最下面一层仅有一块砖.第i层的砖块从左至右编号为1,2,……i,第i层的第j块砖有一个价值a[i,j](a[i,j]<=50).下面是一个有5层砖块的例子.如果你要敲掉第i层的第j块砖的话,若i=1,你可以直接敲掉它,若i>1,则你必须先敲掉第i-1层的第j和第j+1块砖. 你的任务是从一个有n(n<=5

codevs——T1219 骑士游历

 http://codevs.cn/problem/1219/ 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 设有一个n*m的棋盘(2≤n≤50,2≤m≤50),如下图,在棋盘上有一个中国象棋马. 规定: 1)马只能走日字 2)马只能向右跳 问给定起点x1,y1和终点x2,y2,求出马从x1,y1出发到x2,y2的合法路径条数. 输入描述 Input Description 第一行2个整数n和m 第二行4个