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

时间:2021-07-14 23:57:08

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

显然题目要求长度为n的置换中各个循环长度的lcm有多少种情况.

判断一个数m是否是满足题意的lcm. m = ∏ piai, 当∑pia≤ n时是满足题意的. 最简单我们令循环长度分别为piai,不足n的话,我们令其他循环长度为1, 补到=n为止. 这样它们的lcm显然是=m的.

然后就是一个背包了...dp(i, j) = dp(i - 1, j) + ∑1≤t≤adp( i - 1, j - p) 表示前i个质数, 和为j有多少中方案

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

const int maxn = 1009;

ll dp[2][maxn];
int prime[maxn], N = 0, n;
bool check[maxn]; void init() {
memset(check, 0, sizeof check);
for(int i = 2; i <= n; i++) {
if(!check[i])
prime[N++] = i;
for(int j = 0; j < N && i * prime[j] <= n; j++) {
check[i * prime[j]] = true;
if(i % prime[j] == 0) break;
}
}
} int main() { cin >> n;
init(); int c = 0, p = 1;
memset(dp[c], 0, sizeof dp[c]); dp[c][0] = 1;
for(int i = 0; i < N; i++) {
swap(c, p);
memcpy(dp[c], dp[p], sizeof dp[c]);
for(int t = prime[i]; t <= n; t *= prime[i])
for(int j = t; j <= n; j++)
dp[c][j] += dp[p][j - t];
}
ll ans = 0;
for(int i = 0; i <= n; i++) ans += dp[c][i];
cout << ans << endl; return 0;
}

  

1025: [SCOI2009]游戏

Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 1558  Solved: 977
[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。

Output

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

Sample Input

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

Sample Output

【输出样例一】
3
【输出样例二】
16

HINT

【数据规模和约定】

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

Source

BZOJ 1025: [SCOI2009]游戏( 背包dp )的更多相关文章

  1. &lbrack;BZOJ 1025&rsqb; &lbrack;SCOI2009&rsqb; 游戏 【DP】

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

  2. BZOJ 1025&colon; &lbrack;SCOI2009&rsqb;游戏 &lbrack;置换群 DP&rsqb;

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

  3. &lbrack;bzoj 1025&rsqb;&lbrack;SCOI2009&rsqb;游戏(DP)

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

  4. BZOJ 1025 &lbrack;SCOI2009&rsqb;游戏

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

  5. bzoj 1025 &lbrack;SCOI2009&rsqb;游戏(置换群,DP)

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

  6. BZOJ 1025 &lbrack;SCOI2009&rsqb;游戏 &lpar;DP&plus;分解质因子&rpar;

    题意: 若$a_1+a_2+\cdots+a_h=n$(任意h<=n),求$lcm(a_i)$的种类数 思路: 设$lcm(a_i)=x$, 由唯一分解定理,$x=p_1^{m_1}+p_2^{ ...

  7. bzoj 1025&colon; &lbrack;SCOI2009&rsqb;游戏【数学&plus;dp】

    很容易发现行数就是lcm环长,也就是要求和为n的若干数lcm的个数 有结论若p1^a1+p2^a2+...+pm^am<=n,则ans=p1^a1p2^a2..*pm^am是n的一个可行答案.( ...

  8. BZOJ 1025 SCOI2009 游戏 动态规划

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

  9. UESTC 2015dp专题 G 邱老师玩游戏 背包dp

    邱老师玩游戏 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/65 Descr ...

随机推荐

  1. HMTL—表单

    <body> <form> 账号:<input type="text" value="123" /> <br /&gt ...

  2. c&sol;c&plus;&plus;中的各种字符串转换

    一:CString 和 *char 的转换: 1:CString -> *char 1)CString转化为*char可以使用CString中的GetBuffer()函数,具体如下: CStri ...

  3. linkbutton&period;js

    jquery.linkbutton.js /** * linkbutton - jQuery EasyUI * * Licensed under the GPL: * http://www.gnu.o ...

  4. MyBatis 多表关联查询

    多表关联查询 一对多 单条SQL实现. //根据部门编号查询出部门和部门成员姓名public dept selectAll() thorws Excatipon; //接口的抽象方法 下面是对应接口的 ...

  5. The Bug and Exception of Hibernate

    1: hibernate4.3.5 的@oneToOne注解有Bug,建议不使用该版本,或者使用该版本不使用@table   annotation. 2:今天在用hibernate4.2.13的时候, ...

  6. LeetCode&lpar;867&rpar;

    title: LeetCode(867) tags: Python Algorithm 题目描述 给定一个矩阵 A, 返回 A 的转置矩阵. 矩阵的转置是指将矩阵的主对角线翻转,交换矩阵的行索引与列索 ...

  7. Windows下安装模块mysqlclient报错处理

    Windows环境下使用pip命令安装Python模块mysqlclientpip install mysqlclient安装过程报错  [error] Microsoft Visual C++ 14 ...

  8. java 多线程和并行程序设计

    多线程使得程序中的多个任务可以同时执行 在一个程序中允许同时运行多个任务.在许多程序设计语言中,多线程都是通过调用依赖系统的过程或函数来实现的 为什么需要多线程?多个线程如何在单处理器系统中同时运行? ...

  9. Uploading File using Ajax and receiving binary data in Asp&period;net &lpar;C&num;&rpar;&lbrack;转&rsqb;

    基础知识,可由此衍生.原文:http://uniapple.net/blog/?p=2050 In this post, I will show you how to upload a file us ...

  10. eclipse svn使用

    简单介绍一些基本操作 1.同步在Eclipse下,右击你要同步的工程->team->与资源库同步->这时会进入同步透视图,会显示出本机与SVN上内容有不同的文件,双击文件名,会显示出 ...