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,
问一个n元置换群里的所有置换,他们各自的x次方等于π0的这个x,有几种可能;
我们知道一个置换是有许多循环构成的;
于是有:一个对应关系(置换)的所有循环的大小的最小公倍数即是该对应关系(置换)的x,然后一个对应关系(置换)的所有循环的大小的加和不能超过n;
这个东西好像可以用来check一个x;
——对于一个x,把她唯一分解,为,如果把pi换成sum后,结果小于n,则行数x合法,否则,不合法;
(这是在找LCM是x而加和最小的一组数——这组数里的每个数就是一个——然后check她的加和)
然后这个结论没有二分的性质,于是可以尝试枚举x然后check;
——事实上我一开始就写了这个,然后x可能枚举到很大,就炸了......
于是考虑递推一个方案数;
一个合法方案是指:找一组(质数的幂),其加和小于等于n;
(在原题里的意思是:一个合法方案是一个置换,她的每一个循环都是一个质数的幂,当然可以还剩下一些元素,就让他们子环,但是循环的大小和不能比n大)
由于每一个方案构成的x都不同,所以方案数就是答案;
代码:
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN=;
int prime[MAXN];
bool vis[MAXN];
int n,cnt;
long long f[][];
int Prime(int );
int main()
{
int i,j,k;
long long ans=;
scanf("%d",&n);
cnt=Prime(n);
f[][]=;
for(i=;i<=cnt;i++)
for(j=;j<=n;j++){
f[i][j]+=f[i-][j];
for(k=prime[i];k<=j;k*=prime[i])
f[i][j]+=f[i-][j-k];
}
for(i=;i<=n;i++)
ans+=f[cnt][i];
printf("%lld",ans);
return ;
}
int Prime(int n){
int cnt=;
memset(vis,,sizeof(vis));vis[]=;
for(int i=;i<=n;i++){
if(!vis[i])
prime[++cnt]=i;
for(int j=;j<=cnt&&i*prime[j]<=n;j++){
vis[i*prime[j]]=;
if(i%prime[j]==)
break;
}
}
return cnt;
}

P1025[SCOI2009]游戏的更多相关文章

  1. SCOI2009游戏

    1025: [SCOI2009]游戏 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 1065  Solved: 673[Submit][Status] ...

  2. BZOJ 1025 [SCOI2009]游戏

    1025: [SCOI2009]游戏 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 1533  Solved: 964[Submit][Status][ ...

  3. BZOJ 1025: [SCOI2009]游戏( 背包dp )

    显然题目要求长度为n的置换中各个循环长度的lcm有多少种情况. 判断一个数m是否是满足题意的lcm. m = ∏ piai, 当∑piai ≤ n时是满足题意的. 最简单我们令循环长度分别为piai, ...

  4. 【BZOJ1025】[SCOI2009]游戏(动态规划)

    [BZOJ1025][SCOI2009]游戏(动态规划) 题面 BZOJ 洛谷 题解 显然就是一个个的置换,那么所谓的行数就是所有循环的大小的\(lcm+1\). 问题等价于把\(n\)拆分成若干个数 ...

  5. bzoj千题计划116:bzoj1025: [SCOI2009]游戏

    http://www.lydsy.com/JudgeOnline/problem.php?id=1025 题目转化: 将n分为任意段,设每段的长度分别为x1,x2,…… 求lcm(xi)的个数 有一个 ...

  6. AC日记——[SCOI2009]游戏 bzoj 1025

    [SCOI2009]游戏 思路: 和为n的几个数最小公倍数有多少种. dp即可: 代码: #include <bits/stdc++.h> using namespace std; #de ...

  7. 【bzoj1025】[SCOI2009]游戏

    1025: [SCOI2009]游戏 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 1987  Solved: 1289[Submit][Status] ...

  8. BZOJ_1025_[SCOI2009]游戏_DP+置换+数学

    BZOJ_1025_[SCOI2009]游戏_DP+置换 Description windy学会了一种游戏.对于1到N这N个数字,都有唯一且不同的1到N的数字与之对应.最开始windy把数字按 顺序1 ...

  9. BZOJ1025: [SCOI2009]游戏

    Description windy学会了一种游戏.对于1到N这N个数字,都有唯一且不同的1到N的数字与之对应.最开始windy把数字按顺序1,2,3,……,N写一排在纸上.然后再在这一排下面写上它们对 ...

随机推荐

  1. Oracle ltrim() rtrim() 函数详细用法

    今天在论坛里看了一篇帖子,讨论ltrim() 函数的详细用法,下面我借几个高手的回答总结一下: 先看几个实例: SQL> select ltrim('109224323','109') from ...

  2. POJ3460 Booksort(IDA*)

    POJ3460 Booksort 题意:给定一个长度为n的序列,每次可以取出其中的一段数,插入任意一个位置,问最少需要几次操作才能使整个序列变为1~n 思路:IDA*+迭代加深搜索 小技巧:将一段数插 ...

  3. P4842 城市旅行

    题目链接 题意分析 首先存在树上的删边连边操作 所以我们使用\(LCT\)维护 然后考虑怎么维护答案 可以发现 对于一条链 我们编号为\(1,2,3,...,n\) 那么期望就是 \[\frac{a_ ...

  4. BootStrap Modal 点击空白时自动关闭

    本文为大家讲解的是如何禁用 BootStrap Modal 点击空白时自动关闭的方法,感兴趣的同学参考下. 方法如下 $('#myModal').modal({backdrop: 'static', ...

  5. 插播一条 QQ头像无法正常显示问题

    问题背景 不知道啥什么,QQ群的头像有些显示不全直接是默认的头像.想一想最近也没做啥,怎么就出问题了. 后来想一想,大概是个人文件夹的文件出问题了 解决办法 好友头像显示问题的删除 MiscHead. ...

  6. div实现高度自适应的textarea

    textarea使我们常常使用的一种表单形式,多用于大段文字的输入,大多数情况下,textarea都是可以满足需求的,但是当我们希望这个输入框高度自适应的时候,textarea就很难做到了. ok,主 ...

  7. C#集合通论

    前言 写这篇文章的最初动力是来自于一次笔试经历.有一道笔试题大概是这样的:程序使用一个txt文件来存储操作记录.存储记录是多行字符串,每一行代表一次操作记录,格式如下:用户名+操作事项名称+操作时间. ...

  8. 虹软linux错误

  9. redis的数据类型(二)string类型

      下面讲解value,value包括String.List.Set.Sorted Set.Hash 一.String类型 1.string类型  String是最基本的类型,而且Stirng类型是二 ...

  10. 吴恩达《深度学习》第五门课(1)循环序列模型(RNN)

    1.1为什么选择序列模型 (1)序列模型广泛应用于语音识别,音乐生成,情感分析,DNA序列分析,机器翻译,视频行为识别,命名实体识别等众多领域. (2)上面那些问题可以看成使用(x,y)作为训练集的监 ...