luogu P4161 [SCOI2009]游戏
我们发现整个大置换中,会由若干形如\((a_1\rightarrow a_2,a_2\rightarrow a_3,...a_{n-1}\rightarrow a_n,a_n\rightarrow a_1)\)的循环置换组成,记某个循环置换中元素个数为\(m_i\)而整个置换的循环节大小为\(lcm(m_1,m_2,...)\),那么问题转化成把一个数\(n\)拆成若干整数之和,问拆出来的整数的\(lcm\)有多少种
把\([1,n]\)的质数筛出来,然后dfs,从前往后考虑质数\(p_i\),每次从剩余的数中减去\({p_i}^k\),假设某个时刻表示的数为\(s\),那么减去\({p_i}^k\)后就能表示\(s*{p_i}^k\),这样子计算是不重不漏的,但是无法通过此题(方案数为\(long\ long\)级别)
考虑dp,设\(f_i\)为\(n=i\)时的答案,然后依次枚举质数,因为当前考虑的质数之前没考虑,所以\(f_i\)可以从\(f_{i-p_j},f_{i-{p_j}^2},f_{i-{p_j}^3}...\)转移过来,这其实就是个背包
详见代码
#include<bits/stdc++.h>
#define LL long long
#define il inline
#define re register
#define db double
#define eps (1e-5)
using namespace std;
il LL rd()
{
LL x=0,w=1;char ch=0;
while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
int prm[200],tt,n;
char vis[1010];
il void init()
{
for(int i=2;i<=n;i++)
{
if(!vis[i]) prm[++tt]=i;
for(int j=1;j<=tt&&i*prm[j]<=n;j++)
{
vis[i*prm[j]]=true;
if(i%prm[j]==0) break;
}
}
}
LL f[1010];
/*void dfs(int o,int s)
{
if(o>tt||s<prm[o]) return;
dfs(o+1,s);
int xx=prm[o];
while(s>=xx)
{
++ans;
dfs(o+1,s-xx);
xx*=prm[o];
}
}*/
int main()
{
n=rd();
init();
for(int i=0;i<=n;i++) f[i]=1;
for(int i=1;i<=tt;i++)
for(int j=n;j>=0;j--)
for(int k=prm[i];j-k>=0;k*=prm[i])
f[j]+=f[j-k];
printf("%lld\n",f[n]);
return 0;
}
luogu P4161 [SCOI2009]游戏的更多相关文章
- Luogu P4161 [SCOI2009]游戏 数论+DP
ywy神犇太巨辣!!一下就明白了!! 题意:求$lcm(a_1,a_2,...,a_k)$的种类,其中$\Sigma\space a_i <=n$,$a_i$相当于环长 此处的$DP$,相当于是 ...
- LG P4161 [SCOI2009]游戏/LG P6280 [USACO20OPEN]Exercise G
Description(P4161) windy学会了一种游戏. 对于1到N这N个数字,都有唯一且不同的1到N的数字与之对应. 最开始windy把数字按顺序1,2,3,……,N写一排在纸上. 然后再在 ...
- P4161 [SCOI2009]游戏
传送门 首先这题的本质就是把\(n\)分成若干个数的和,求他们的\(lcm\)有多少种情况 然后据说有这么个结论:若\(p_1^{c_1}+p_2^{c_2}+...+p_m^{c_m}\leq n\ ...
- SCOI2009游戏
1025: [SCOI2009]游戏 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 1065 Solved: 673[Submit][Status] ...
- BZOJ 1025 [SCOI2009]游戏
1025: [SCOI2009]游戏 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 1533 Solved: 964[Submit][Status][ ...
- BZOJ 1025: [SCOI2009]游戏( 背包dp )
显然题目要求长度为n的置换中各个循环长度的lcm有多少种情况. 判断一个数m是否是满足题意的lcm. m = ∏ piai, 当∑piai ≤ n时是满足题意的. 最简单我们令循环长度分别为piai, ...
- luogu P2657 [SCOI2009]windy数 数位dp 记忆化搜索
题目链接 luogu P2657 [SCOI2009]windy数 题解 我有了一种所有数位dp都能用记忆话搜索水的错觉 代码 #include<cstdio> #include<a ...
- 【BZOJ1025】[SCOI2009]游戏(动态规划)
[BZOJ1025][SCOI2009]游戏(动态规划) 题面 BZOJ 洛谷 题解 显然就是一个个的置换,那么所谓的行数就是所有循环的大小的\(lcm+1\). 问题等价于把\(n\)拆分成若干个数 ...
- bzoj千题计划116:bzoj1025: [SCOI2009]游戏
http://www.lydsy.com/JudgeOnline/problem.php?id=1025 题目转化: 将n分为任意段,设每段的长度分别为x1,x2,…… 求lcm(xi)的个数 有一个 ...
随机推荐
- 为Bootstrap模态对话框添加拖拽移动功能
请自行下载使用到的Bootstrap库及jQuery库 <!DOCTYPE html> <html> <head lang="en"> < ...
- codeforces278A
Circle Line CodeForces - 278A 郑州地铁的圆线有n个车站. 我们知道所有邻近站点之间的距离: d[1]是第1站和第2站之间的距离;d[2]是第2站和第3站之间的距离;… d ...
- JavaScript 隐式类型转换
JavaScript 隐式类型转换 原文:https://blog.csdn.net/itcast_cn/article/details/82887895 · 1.1 隐式转换介绍 · 1.2 隐式转 ...
- mysql 免安装版 启动服务马上关闭
在my.ini 加入这一句 1.直接在后面加上一下的参数 [mysqld] port=3306 basedir=D:\mysql-5.7.17-win32 datadir=D:\mysql-5.7.1 ...
- IDEA上传码云报错Push rejected: Push to origin/master was rejected
原因是README.md文件冲突,码云上在创建项目的时候不要初始化README.md,然后再用IDEA上传
- 自学Python1.3-centos内python3并与python2共存
自学Python之路 自学Python1.3-centos内python3并与python2共存 1. 查看是否已经安装Python 测试机系统CentOS 7 默认安装了python2.7, 使用 ...
- 【BZOJ2425】[HAOI2010]计数(组合数学)
[BZOJ2425][HAOI2010]计数(组合数学) 题面 BZOJ 洛谷 题解 很容易的一道题目. 统计一下每个数位出现的次数,然后从前往后依次枚举每一位,表示前面都已经卡在了范围内,从这一位开 ...
- 洛谷 CF55D Beautiful numbers 解题报告
CF55D Beautiful numbers 题意 \(t(\le 10)\)次询问区间\([l,r](1\le l\le r\le 9\times 10^{18})\)中能被每一位上数整除的数的个 ...
- tf 数据读取
tf.train.batch( tensors, batch_size, num_threads=1, capacity=32, enqueue_many=False, shapes=None, dy ...
- 从C,C++,JAVA和C#看String库的发展(一)----C语言和C++篇
转自: http://www.cnblogs.com/wenjiang/p/3266305.html 基本上所有主流的编程语言都有String的标准库,因为字符串操作是我们每个程序员几乎每天都要遇到的 ...