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 ;
}

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

  1. BZOJ 1025 [SCOI2009]游戏

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

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

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

  3. 【BZOJ】1025: [SCOI2009]游戏(置换群+dp+特殊的技巧+lcm)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1025 首先根据置换群可得 $$排数=lcm\{A_i, A_i表示循环节长度\}, \sum_{i= ...

  4. bzoj 1025 [SCOI2009]游戏(置换群,DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1025 [题意] 给定n,问1..n在不同的置换下变回原序列需要的不同排数有多少种. [ ...

  5. 1025: [SCOI2009]游戏 - BZOJ

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

  6. [BZOJ 1025] [SCOI2009] 游戏 【DP】

    题目链接:BZOJ - 1025 题目分析 显然的是,题目所要求的是所有置换的每个循环节长度最小公倍数的可能的种类数. 一个置换,可以看成是一个有向图,每个点的出度和入度都是1,这样整个图就是由若干个 ...

  7. [bzoj 1025][SCOI2009]游戏(DP)

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1025 分析:首先这个问题等价于A1+A2+……Ak=n,求lcm(A1,A2,……,Ak)的种 ...

  8. BZOJ 1025 SCOI2009 游戏 动态规划

    标题效果:特定n.行定义一个替代品1~n这种更换周期发生后,T次要(T>0)返回到原来的顺序 找到行的所有可能的数 循环置换分解成若干个,然后行位移数是这些周期的长度的最小公倍数 因此,对于一些 ...

  9. BZOJ 1025: [SCOI2009]游戏 [置换群 DP]

    传送门 题意:求$n$个数组成的排列变为升序有多少种不同的步数 步数就是循环长度的$lcm$..... 那么就是求$n$划分成一些数几种不同的$lcm$咯 然后我太弱了这种$DP$都想不出来.... ...

随机推荐

  1. Leetcode题解

    前言 Leetcode现在弄了一个Weekly Contest,然后题目又会作为新题目:感觉如果现在还不及时刷题的话可能真的赶不上它题目增长的速度了.......题目会在博客和Github上同步更新的 ...

  2. KMP 串的模式匹配 (25 分)

    给定两个由英文字母组成的字符串 String 和 Pattern,要求找到 Pattern 在 String 中第一次出现的位置,并将此位置后的 String 的子串输出.如果找不到,则输出“Not ...

  3. 判断是pc端登录还是移动端登录

    java判断 https://blog.csdn.net/qq_32657581/article/details/71405838 https://zhidao.baidu.com/question/ ...

  4. Shell 学习—AWK介绍

    Shell 学习—AWK = = = 安装awk root@kiki-desktop:~/shell# apt-get install gawk gawk-doc = = = awk 是一种程序语言. ...

  5. windows用一键安装包安装(推荐)

    为了简化大家在windows下面的安装,我们在xampp基础上做了禅道的windows一键安装包.xampp是业内非常著名的AMP集成运行环境.禅道的一键安装包主要在它基础上做了大量的精简,并集成了我 ...

  6. java CountDownLatch 等待多线程完成

    CountDownLatch允许一个或多个线程等待其他线程完成操作. package com.test; import java.util.concurrent.CountDownLatch; pub ...

  7. MPAndroidChart开源图表库---折线图

    项目地址:点击打开,原文参考地址:点击打开 1. 将mpandroidchartlibrary-2-0-8.jar包copy到项目的libs中 2. 定义xml文件 <?xml version= ...

  8. Java语言程序设计(第三版)第二章课后习题答案(仅供参考)

    2.1   注意不同类型转换 import java.util.Scanner; public class Ch02 { public static void main(String[] args) ...

  9. 玩转spring ehcache 缓存框架

    一.简介 Ehcache是一个用Java实现的使用简单,高速,实现线程安全的缓存管理类库,ehcache提供了用内存,磁盘文件存储,以及分布式存储方式等多种灵活的cache管理方案.同时ehcache ...

  10. centOS7虚拟机连接大网

    1.启动vm服务 如果遇到无法启动时,需要还原vm默认配置解决 2.更改vm设置为NAT模式 3.centOS开启DHCP