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 。

分析

要用到一点点群论的知识:一个置换可以分解成若干个不相交循环的乘积,且这个置换的阶数就等于各个循环的元素个数的最小公倍数。

那么我们要考虑的问题变成了:将N划分成若干个整数的和,这些整数的最小公倍数共有多少种取值?

先考虑一个整数的唯一分解$M=\prod {p_i} ^ {a_i}$,如果它在答案中,则$S = \sum {p_i} ^ {a_i}$一定在N以内。因为对于一个不大于N的整数的任何一个满足最大公约数大于1的整数划分,我们将每个整数中重复的质因子除去,得到的一组两两互质的整数,它们的和也一定不大于N,且它们的最小公倍数不变。因此我们只需计算出N以内这些两两互质的整数划分的方案树就可以了。简单来说,就是“要用一个整数划分凑出某个确定的最小公倍数,最‘节约’的方案是用这个最小公倍数的唯一分解”。

具体地,我们可以先筛出N以内的所有素数,对于每种素数只能选择其中的一个幂次乘入答案,求一下分组背包就可以了。

 1 /**************************************************************
 2     Problem: 1025
 3     User: AsmDef
 4     Language: C++
 5     Result: Accepted
 6     Time:4 ms
 7     Memory:824 kb
 8 ****************************************************************/
 9  
10 /***********************************************************************/
11 /**********************By Asm.Def-Wu Jiaxin*****************************/
12 /***********************************************************************/
13 #include <cstdio>
14 #include <cstring>
15 #include <cstdlib>
16 #include <ctime>
17 #include <cctype>
18 #include <algorithm>
19 #include <cmath>
20 using namespace std;
21 typedef long long LL;
22 #define SetFile(x) ( freopen(#x".in", "r", stdin), freopen(#x".out", "w", stdout) )
23 #define getc() getchar()
24 template<class T>inline void getd(T &x){
25     char ch = getc();bool neg = false;
26     while(!isdigit(ch) && ch != '-')ch = getc();
27     if(ch == '-')ch = getc(), neg = true;
28     x = ch - '0';
29     while(isdigit(ch = getc()))x = x * 10 - '0' + ch;
30     if(neg)x = -x;
31 }
32 inline void putLL(LL x){
33     if(x < 1000000000){printf("%d\n", x);return;}
34     int l = x / 1000000000, r = x % 1000000000;
35     printf("%d%09d\n", l, r);
36 }
37 /***********************************************************************/
38 const int maxn = 1010;
39 int prime[maxn], pcnt, N;
40 LL F[maxn], tmp[maxn];
41 inline void euler(){
42     bool not_p[maxn] = {0};
43     int i, j;
44     for(i = 2;i <= N;++i){
45         if(!not_p[i])prime[++pcnt] = i;
46         for(j = 1;j <= pcnt;++j){
47             if(i * prime[j] > N)break;
48             not_p[i * prime[j]] = true;
49             if(i % prime[j] == 0)break;
50         }
51     }
52 }
53  
54 inline void work(){
55     getd(N);
56     euler();
57     //for(int i = 1;i <= pcnt;++i)printf("%d\n", prime[i]);
58     int i, j, p, d;
59     LL ans = 1;
60     F[0] = 1;
61     for(i = 1;i <= pcnt;++i){
62         p = prime[i];
63         memcpy(tmp, F, sizeof(F));
64         for(d = p;d <= N;d *= p)
65             for(j = d;j <= N;++j)F[j] += tmp[j-d];
66     }
67     for(i = 1;i <= N;++i) ans += F[i];
68     putLL(ans);
69 }
70  
71 int main(){
72  
73 #ifdef DEBUG
74     freopen("test.txt", "r", stdin);
75 #elif !defined ONLINE_JUDGE
76     //SetFile(bzoj_1025);
77 #endif
78     work();
79  
80 #ifdef DEBUG
81     //printf("\n%.2lf sec \n", (double)clock() / CLOCKS_PER_SEC);
82 #endif
83     return 0;
84 }

分组背包

转载于:https://www.cnblogs.com/Asm-Definer/p/4374062.html

[bzoj1025][SCOI2009]游戏 (分组背包)相关推荐

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

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

  2. bzoj-1025 [SCOI2009]游戏

    1025: [SCOI2009]游戏 Time Limit: 1 Sec  Memory Limit: 162 MB Description windy学会了一种游戏.对于1到N这N个数字,都有唯一且 ...

  3. bzoj1025 [SCOI2009]游戏 动态规划

    题目描述 对于一些长度为n的排列,将其作为一个置换,那么可能有一个自置换的次数使其回到1,2,3,...,n的情况.求对于所有能够回到1,2,3..,n的排列,不同的次数共有多少种. 题解来自黄学长 ...

  4. [BJOI2019] 排兵布阵(分组背包)

    [BJOI2019] 排兵布阵 题目描述 小 C 正在玩一款排兵布阵的游戏.在游戏中有 nnn 座城堡,每局对战由两名玩家来争夺这些城堡.每名玩家有 mmm 名士兵,可以向第 iii 座城堡派遣 ai ...

  5. 洛谷P5322 [BJOI2019]排兵布阵【分组背包】

    题目描述 小 C 正在玩一款排兵布阵的游戏.在游戏中有 n 座城堡,每局对战由两名玩家来争夺这些城堡.每名玩家有 m 名士兵,可以向第 i 座城堡派遣 a_i名士兵去争夺这个城堡,使得总士兵数不超过 ...

  6. 牛客 F - 爬塔 (分组背包)

    中国计量大学现代科技学院第四届"中竞杯"程序设计校赛(同步赛)F - 爬塔 链接:https://ac.nowcoder.com/acm/contest/9680/F 题目描述 高 ...

  7. 分组背包----HDU1712 ACboy needs your help

    很简单的一道分组背包入门问题.不多解释了. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring&g ...

  8. HDU 3033 I love sneakers! (分组背包变形)

    题目大意:xx去买鞋,有k种牌子,然后给出n双鞋,每双鞋有它属于的牌子.价格.收藏价值.xx认为他不差钱,要求每种鞋子买一双.但实际上他只有m毛钱,问能否买到符合xx要求的鞋,能找到的话输出最大的收藏 ...

  9. hdu 1712(分组背包)

    题意:有N个课程,然后选择M天内学习的效益最大值,注意每个课程最多选取一次. 解题思路:裸的分组背包,把每门课程看做是每一组,每一组里面最多选择一个天数,典型的分组背包.详见背包九讲 #include ...

最新文章

  1. Ubuntu“无法获得锁\加锁”解决方案
  2. ​选择云服务器的小窍门
  3. 数据:以太坊2.0合约新增8032 ETH
  4. SAP License:这种ERP系统核查工作实际是在做无用功
  5. 数据操纵:SELECT, INSERT, UPDATE, DELETE
  6. S7-300系列PLC如何通过GSD文件实现PROFIBUS DP主从通讯?
  7. 【Python+GDAL矢量数据操作】
  8. 【Flutter系列】第一期——初识Dart语言
  9. c语言中常量单双引号,C语言常量中字元与字串 除了单引号与双引号的区别外,还有什么不同。...
  10. macOS app动态修改app图标,图标为icns格式
  11. 三个月来美国又有一万家餐馆因疫情倒闭或关闭;爱彼迎帮助在危机中的人寻找临时住宿 | 美通企业日报...
  12. Unity 进阶 之 实现简单的音频可视化封装(包括音频和麦克风)
  13. 爱快可迅速普及家庭专线?
  14. 2016-年蓝桥杯C-(A组)赛题-网友年龄
  15. 墨子管理启发的“天龙八部”
  16. 软件工程Alpha冲刺集合
  17. 建仓价和持仓价的应用:如何开仓如何持仓
  18. PLS回归 (OLS)最小二乘法 PCA) 偏最小二乘法 (PLS) SIMPLS算法 20200723
  19. 每日一问 --什么是有线信道?
  20. 九联UNT413A-S905L3A-免拆U盘卡刷固件包-当贝纯净桌面-内有教程

热门文章

  1. 什么是android刷机包,什么是安卓RAM?安卓RAM和安卓ROM有什么区别?
  2. 网络推广期间新站收录慢网络推广专员如何作答?
  3. 网站文章不收录怎么办!
  4. 用力和应变片计算弹性模量_第4章 力学量传感器.pptx
  5. matlab2011实验3,matlab实验3探索.doc
  6. matlab中非0即1函数,matlab 中统计一个数组中非零元素个素的函数名称是什么?
  7. python写if_用python编写if-else的更优雅的方法
  8. go语言学习(1)map常规使用
  9. MongoDB C++ gridfs worked example
  10. elasticsearch聚合操作——本质就是针对搜索后的结果使用桶bucket(允许嵌套)进行group by,统计下分组结果,包括min/max/avg...