Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 2727  Solved: 1794
[Submit][Status][Discuss]

Description

  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想知道,对于所有可能的对应关系,有多少种可
能的排数。

Input

  包含一个整数N,1 <= N <= 1000

Output

  包含一个整数,可能的排数。

Sample Input

【输入样例一】
3
【输入样例二】
10

Sample Output

【输出样例一】
3
【输出样例二】
16
 
这其实更像一道数学题。。。
以题目中N=6为例:
1 2 3 4 5 6 对应的关系为 1->2 2->3 3->1 4->5 5->4 6->6
可以划分为(1,2,3) (4,5) (6) 三个循环节,模拟计算几组数据后发现都可以划分为这样的循环节
循环节的长度之和正好等于N,(即:3+2+1=6),而一个可能的排数等于LCM(循环节长度),即所有循环节长度的公倍数+1
因此问题转化为:和为N的一串数,求它们的最小公倍数,而这一串数可以继续分解成更小的数(即这一串数不是固定的),并继续求最小公倍数,所有可能的最小公倍数的总数,即为方案数
如:
一串数    最小公倍数
6        6
5 1       5
4 2       4
4 1 1       4
3 3       3
。。。。。。
最终可以发现可行的最小公倍数是:1,2,3,4,5,6,这六种,因此答案为6
而怎么求这一串数又成了问题,这里可以反过来思考,一个可行的最小公倍数需要满足的条件。
最小公倍数一定是一个合数,而一个合数可以分解为多个质数的积,那么最小公倍数的一个因数就是多个质数相乘后的积,并且需要满足所有因数的和小于等于N
因此可以得到最小公倍数Z=a1^b1 × a2^b2 × a3^b3 × ...(a为质数),如6=3^1 × 2^1
等于N我们都知道,至于为什么可以小于N,假设N=6为例,其中一种可行的最小公倍数,6=3^1×2^1,而3+2≤6。
因为作为这一串数:
一串数    最小公倍数
3 2 1       6
可以补1这种情况。
接下来就要用到动态规划,设f[i][j],i表示前i个质数,j表示因数的和,表示前i个质数,因数和小于等于N的情况总数
 
 
 #include<iostream>
#include<cstring>
#include<cstdio>
using namespace std; #define LL long long const int MAXN=;
int cnt=,prime[MAXN];
int n;
LL ans,f[][];
void Prime(int x)
{
bool mark[MAXN];
for(int i=;i<=x;i++)
{
if(!mark[i]) prime[++cnt]=i;
for(int j=;j<=cnt&&prime[j]*i<=x;j++)
{
mark[prime[j]*i]=;
if(i%prime[j]==) break;
}
}
} int main()
{
scanf("%d",&n);
Prime(n);
f[][]=;
for(int i=;i<=cnt;i++)
for(int j=;j<=n;j++)
{
f[i][j]+=f[i-][j];
for(int k=prime[i];k<=j;k*=prime[i])
f[i][j]+=f[i-][j-k];
}
for(int i=;i<=n;i++)
ans+=f[cnt][i];
cout<<ans<<endl;
return ;
}

最新文章

  1. 作为WEB工程师,我们是不是应该积极的推进一下用户浏览器的使用体验?
  2. SQL2005中设置自动编号字段【转】
  3. NFC(13)使用Android Beam技术传输文件
  4. String Split 和 Join
  5. 冒泡排序小实例 php
  6. 只有20行Javascript代码!手把手教你写一个页面模板引擎
  7. python运维开发(二十一)----文件上传和验证码+session
  8. EFDB 基本规范&amp;知识
  9. 张高兴的 UWP 开发笔记:定制 ContentDialog 样式
  10. 用lua+redis实现一个简单的计数器功能 (二)
  11. NYoj_49开心的小明
  12. iOS-cocoapods安装与使用以及常见错误
  13. 【webpack系列】从零搭建 webpack4+react 脚手架(一)
  14. ubuntu fiddler firefox http网页不能访问 Secure Connection Failed
  15. Maven学习笔记1(clean compile package install)
  16. HashMap内部结构及实现原理
  17. 【译】11. Java反射——动态代理
  18. BZOJ3286 Fibonacci矩阵 矩阵 快速幂 卡常
  19. BZOJ3070 : [Pa2011]Prime prime power 质数的质数次方
  20. c++学习计划

热门文章

  1. java基础---GC
  2. 【经验总结】tcp_tw_recycle参数引发的故障
  3. Python 魔术方法及调用方式
  4. (转)linux 系统下虚拟用户的作用
  5. ssh无需密码登录linux服务器
  6. asp.net MVC 4.0 Controller回顾——ModelBinding实现过程
  7. 用命令行的方式将本地项目上传到git
  8. 北航oo作业第三单元小结
  9. iOS开发ReactiveCocoa学习笔记(四)
  10. 生产消费者模式与python+redis实例运用(基础篇)