[BZOJ1025] [SCOI2009]游戏 解题报告

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

  题意是让我们求回归到原序列的置换次数,也就是对于这个置换的每一个循环大小的最小公倍数

  如(123)(45)(6)

  对于第一个循环回归需要3x次(x代表任意自然数),第二个循环需要2x次,第三个循环需要x次

  显然对于这样的置换答案是6次

  有多少种可能的排数,也就是这个最小公倍数有多少种可能..?

  看起来比较奇怪的问题...

  我们用一个序列来表示最小公倍数

  2  3   5   7   11...997

  x1 x2  x3  x4  x5...x168

  最小公倍数就是2^x1*3^x2*5^x3...997^x168(说白了就是质因数分解>w<)

  对于每一个循环,它的大小质因数分解之后对于每个质因子的系数都<=上面的序列

  然后原问题就是满足题意的x1,x2..x168有多少种

  我们来考虑怎样才会不满足题意...

  首先x1,x2..x168再小也无所谓,因为就算全为0也是满足题意的,剩下的都可以用1来补全

  显然对于这些x最小的n就是2^x1+3^x2...+997^x168

  因为一旦2出现了x1次,说明一定有一个循环的个数中含有2^x1这个因子,我们令其中一个等于这个

  为了使n最小化,其它都不含2这个因子

  另外加法比乘法代价小这个显然...

  也就是说对于x序列的限制也就是2^x1+3^x2...997^x168<=n

  非常眼熟...非常简单的01背包...

  

 1 /**************************************************************
 2     Problem: 1025
 3     User: mjy0724
 4     Language: Pascal
 5     Result: Accepted
 6     Time:112 ms
 7     Memory:8236 kb
 8 ****************************************************************/
 9
10 program bzoj1025;
11 const maxn=1010;
12 var n,ans:int64;
13     i,j,k:longint;
14     p:array[-1..maxn]of int64;
15     f:array[-1..maxn,-1..maxn]of int64;
16     vis:array[-1..maxn]of boolean;
17
18 procedure Euler;
19 var i,j:longint;
20 begin
21     fillchar(vis,sizeof(vis),true);
22     p[0]:=0;
23     for i:=2 to n do
24     begin
25         if vis[i] then
26         begin
27             inc(p[0]);
28             p[p[0]]:=i;
29         end;
30         for j:=1 to p[0] do
31         begin
32             if i*p[j]>n then break;
33             vis[i*p[j]]:=false;
34             if i mod p[j]=0 then break;
35         end;
36     end;
37 end;
38
39 begin
40     readln(n);
41     Euler;
42     fillchar(f,sizeof(f),0);
43     f[0,0]:=1;
44     for i:=1 to p[0] do
45         for j:=0 to n do
46         begin
47                         f[i][j]:=f[i-1][j];
48             k:=p[i];
49             while k<=j do
50             begin
51                 inc(f[i,j],f[i-1,j-k]);
52                 k:=k*p[i];
53             end;
54         end;
55     ans:=0;
56     for i:=0 to n do inc(ans,f[p[0],i]);
57     writeln(ans);
58 end.
时间: 2024-10-08 08:17:35

[BZOJ1025] [SCOI2009]游戏 解题报告的相关文章

BZOJ1025: [SCOI2009]游戏

1025: [SCOI2009]游戏 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2029  Solved: 1315[Submit][Status][Discuss] Description windy学会了一种游戏.对于1到N这N个数字,都有唯一且不同的1到N的数字与之对应.最开始windy把数字按顺序1,2,3,……,N写一排在纸上.然后再在这一排下面写上它们对应的数字.然后又在新的一排下面写上它们对应的数字.如此反复,直到序列再次变为1,

NOIP2008 普及组T3 传球游戏 解题报告-S.B.S.

题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏. 游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每个同学可以把球传给自己左右的两个同学中的一个(左右任意),当老师在此吹哨子时,传球停止,此时,拿着球没有传出去的那个同学就是败者,要给大家表演一个节目. 聪明的小蛮提出一个有趣的问题:有多少种不同的传球方法可以使得从小蛮手里开始传的球,传了m次以后,又回到小蛮手里.两种传球方法被视作不同的方法,当且仅当

[bzoj1025][SCOI2009]游戏 (分组背包)

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

leetcode 174. 地下城游戏 解题报告

leetcode 174. 地下城游戏 一些恶魔抓住了公主(P)并将她关在了地下城的右下角.地下城是由 M x N 个房间组成的二维网格.我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主. 骑士的初始健康点数为一个正整数.如果他的健康点数在某一时刻降至 0 或以下,他会立即死亡. 有些房间由恶魔守卫,因此骑士在进入这些房间时会失去健康点数(若房间里的值为负整数,则表示骑士将损失健康点数):其他房间要么是空的(房间里的值为 0),要么包含增加骑士健康点数的魔

[ZJOI2015]幻想乡战略游戏 解题报告 (动态点分治)

[ZJOI2015]幻想乡战略游戏 题意 有一棵大小为 \(n\) 的带权树, 每个点有一个权值, 权值可以修改 \(q\) 次, 找出一个补给点 \(x\) , 使得 \(\sum_{u \in V} val[u] \times dis(x,u)\) 最小, 并求出这个最小值. 一句话 : 求带权重心 (zsy说的) 附加条件 : 树中所有点的度数不超过 \(20\). 思路 一道你以为复杂度过不了, 但其实是过得了的题. 首先, 我们假定先选了一个点 \(u\) 作为补给点, 我们可以算出它

bzoj1025: [SCOI2009]游戏(DP)

题目大意:将长度为n的排列作为1,2,3,...,n的置换,有可能置换x次之后,序列又回到了1,2,3,...,n,求所有可能的x的个数. 看见这种一脸懵逼的题第一要务当然是简化题意...我们可以发现,序列回到原状的次数就是每个循环的规模(即在循环中的数字个数)的lcm,而且因为有n个数,显然所有循环的规模之和就是n,那么问题就被简化成了a1+a2+a3+...+ak=n,求lcm(a1,a2,a3,...,an)的个数. 现在题意已经清楚多了,那咋写呢QAQ 我们把一个数分解质因数,p为质数,

bzoj1025 [SCOI2009]游戏——因数DP

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1025 这篇博客写得真好呢:https://www.cnblogs.com/phile/p/4473192.html 代码如下: #include<iostream> #include<cstdio> #include<cstring> using namespace std; int n,pri[1005],cnt; long long f[1005][1005]

CH Round #56 - 国庆节欢乐赛解题报告

最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树,其中一些树上结有能够产生能量的魔力水果.已知每个水果的位置(Xi,Yi)以及它能提供的能量Ci.然而,魔幻森林在某些时候会发生变化:(1) 有两行树交换了位置.(2) 有两列树交换了位置.当然,树上结有的水果也跟随着树一起移动.不过,只有当两行(列)包含的魔力水果数都大于0,或者两行(列)都没有魔

济南-1029试题解题报告

By shenben 本解题报告解析均为100分解题思路. 上午 T1 题意:给你两个日期,问这两个日期差了多少毫秒 解析:标程用ctime库函数写的,编译器版本高了才会过(NOIP编译器版本不会太高): 只能老老实实打模拟. 小技巧:最后多输出“000”,计算秒就好了.(特判两个时间相同,只输出“0”) T2 题意:有m个站口,有n个人按顺序排队,求n+1个人最少等多长时间 解析:(标程显然 同下) ①n<m 输出0(显然) ②n>=m 建一个小根堆(可以用优先队列),把前m个人的时间扔到堆