NOIp模拟3 游戏


试题描述


  windy学会了一种游戏。
  对于1到N这N个数字,都有唯一且不同的1到N的数字与之对应。
  最开始windy把数字按顺序1,2,3,……,N写一排在纸上。
  然后再在这一排下面写上它们对应的数字。
  然后又在新的一排下面写上它们对应的数字。
  如此反复,直到序列再次变为1,2,3,……,N。

  如:
    1 2 3 4 5 6
    对应的关系为
    1->2 2->3 3->1 4->5 5->4 6->6
  windy的操作如下

  1 2 3 4 5 6
  2 3 1 5 4 6
  3 1 2 4 5 6
  1 2 3 5 4 6
  2 3 1 4 5 6
  3 1 2 5 4 6
  1 2 3 4 5 6

  这时,我们就有若干排1到N的排列,上例中有7排。
  现在windy想知道,对于所有可能的对应关系,有多少种可能的排数。


输入格式


一个整数N


输出格式


一个整数,可能的排数。


输入示例


输入样例一:
3

输入样例二:
10


输出示例


输出样例一:
3

输出样例二:
16


注释说明


30%的数据,满足 1 <= N <= 10
100%的数据,满足 1 <= N <= 1000

【分析】

对于原序列,每个数都有唯一且不同的数与之对应,这很像函数关系。

而对于对应序列,每个数的原像的是唯一的,所以序列中必定有若干个首尾相接的环,所有环中的数的总和为n。

又因为一个长度为m的环经过k*m次变换可以回到原来的状态,所以这个问题转化成了求若干个和为n的数的最小公倍数有多少种。

再因为若干个数的LCM是这若干个数中出现过的质因数中最高幂的乘积,而质数幂都是不同的,所以这个问题最后转化成了完全背包问题...

注意这里不足n的话可以用1补齐,任何数乘1都还是原数,这里也相当于背包可以不装满。

【代码】

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 int n, len=1;
 5 long long ans;
 6 long long a[1020], dp[1020];
 7 int pr[200]={0, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73,
 8 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163,
 9  167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251,
10  257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349,
11  353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443,
12  449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557,
13  563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647,
14  653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757,
15  761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863,
16  877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983,
17  991, 997};//偷懒打了个质数表
18
19 int main() {
20     cin >> n;
21     dp[0]=1;
22     for (int i=1;i<=168;++i)
23         for (int j=n;j>=pr[i];--j)
24             for (int k=pr[i];k<=j;k*=pr[i])
25                 dp[j]+=dp[j-k];
26     for (int i=0;i<=n;++i)
27         ans+=dp[i];
28     cout << ans << endl;
29 }
时间: 2024-08-05 07:06:51

NOIp模拟3 游戏的相关文章

NOIP模拟 6.28

NOIP模拟赛6.28 Problem 1 高级打字机(type.cpp/c/pas) [题目描述] 早苗入手了最新的高级打字机.最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧. 请为这种高级打字机设计一个程序,支持如下3种操作: 1.T x:在文章末尾打下一个小写字母x.(type操作) 2.U x:撤销最后的x次修改操作.(Undo操作) (注意Query操作并不算修改操作) 3.Q x:询问当前文章中第x个字母并输出.(Query操作) 文章一开始可以视为空串. [输入格式]

2012-10-20 NOIP模拟赛

      2012-10-20 NOIP模拟赛 by coolyangzc 共3道题目,时间3小时 题目名 高级打字机 不等数列 经营与开发 源文件 type.cpp/c/pas num.cpp/c/pas exploit.cpp/c/pas 输入文件 type.in num.in exploit.in 输出文件 type.out num.out exploit.out 时间限制 1000MS 1000MS 1000MS 内存限制 256MB 256MB 256MB 测试点 5+(5) 10

Noip 模拟练习9

Noip 模拟练习9 较容易.一次AK. 锻炼计划 Description 身体是革命的本钱, OIers 不要因为紧张的学习和整天在电脑前而忽视了健 康问题.小 x 设计了自己的锻炼计划,但他不知道这个计划是否可行,换句话 说如果计划不当可能会让他的体力超支,所以小 x 请你帮助他. 一天有 1440 分钟,所以小 x 列出的是这一整天第 1 至第 1440 分钟的计划. 小 x 的体力用一个整数来表示,他会按照计划表进行锻炼,同时,每分钟小 x 的体力会自动增加 1.如果某一分钟末小 x 的

NOIP模拟17.8.17

NOIP模拟17.8.17 A 小 G 的字符串文件名 输入文件 输出文件 时间限制 空间限制str.pas/c/cpp str.in str.out 1s 128MB[题目描述]有一天,小 L 给小 G 出了这样一道题:生成一个长度为 n 的.全由小写英文字母构成的字符串,只能使用 k 种字母.要求满足:• 字符串中相邻的两个字母不能相同.• 必须出现恰好 k 种不同的字母.这样的合法字符串可能有很多,小 L 让小 G 输出字典序最小的那个.小 G 太笨啦,不会做这道题,希望你帮帮他.[输入格

不使用物理引擎,自己动手做真实物理的模拟投篮游戏

最近打算做一个2D投篮游戏,由于对于BOX2D等物理引擎并不熟悉,加之一开始低估了游戏所需要的碰撞检测复杂度,认为仅仅涉及4面墙,篮球,篮板,篮筐,篮网的碰撞检测并不复杂.因此决定自己实现所需要的碰撞检测.结果实际开始做时磕磕碰碰遇到了许多问题. 1.如何实现像素级碰撞检测. as3原生的hitTestObject只能检测矩形,对于圆形等其他形状就不适用了:打算用hitTestPoint来检测篮球与篮板四个边角,篮筐前后框点,在实践尝试中发现是有问题的,在涉及物体旋转的情况下检测就不精确了.因此

[BZOJ入门OJ2092][Noip模拟题]舞会

2092: [Noip模拟题]舞会 Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 9  Solved: 5 [Submit][Status][Web Board] Description 学校举行舞会啦,一共有N个人参加,所有人站成一排,从左开始编号,最左边的人编号为1 ,最右边的为N.每个人跳舞的熟练度我们用一个整数表示,第i个人的熟练度为Ai,每次熟 练度最接近的一对相邻男女会出列跳舞,如果有多对那么最左边的那一对会先出列,请你给 出出列跳

【简单思考】noip模拟赛 NTR酋长

NTR酋长 (ntr.pas/.c/.cpp) 黄巨大终于如愿以偿的进入了czy的后宫中……但是czy很生气……他要在黄巨大走到他面前的必经之路上放上几个NTR酋长来阻挡黄巨大. 众所周知,NTR酋长有一个技能是沟壑(F).它会在地图上产生一条长长的障碍物阻挡人前进.Czy打算在一个n*m的矩形(必经之路?)中放上NTR酋长.NTR酋长要一个一个放下去,而且每放一个都会向四角倾斜的方向放出无限长的沟壑,而已经被沟壑挡住的地方就不能再放NTR酋长了. 请注意:不会出现沟壑的路径挡住另一个沟壑的情况

【noip模拟赛】 射击

这题似乎是什么安阳一中的模拟题,不管了,反正是学长出的noip模拟赛里面的题目.... 射击(shoot.pas/.c/.cpp) 时间限制:1s,内存限制128MB 题目描述: 据史书记载,对越反击战时期,有位中国侦察兵,他的代号叫814.一天他执行狙击任务,他的任务地区是n座恰巧在一条直线上的山.这些山所在直线恰巧为东西走向,山从东到西依次编号为1~n.一天814隐藏在编号为k的山上,每座山上都有1个目标. 814也非常的厉害,任务结束时杀了很多人,可是史书中只记载了两点: 1:814一定攻

NOIP模拟赛

#1[Nescafé 31]杯NOIP模拟赛 t1 题意:n*m的棋盘上从(1,1)走到(n,m),只能向下或向右,一些格子有老鼠,每个老鼠互不相同,当处于与老鼠有重边的格子时,视为看见了这只老鼠,求到终点看到最少的不同老鼠数. 分析:DP 由于求得是看到的不同的老鼠数目,不能直接用过河卒做,因为同一个位置的老鼠可能会统计多次,我们还需要增加一维即方向. f[i,j,0]表示到从上面一个格子走到(i,j)时最少老鼠数,f[i,j,1]表示左边. f[i,j,0]:=min(f[i-1,j,0]+