[FZYZOJ 2162] Zrn神犇之折纸游戏

P2162 -- Zrn神犇之折纸游戏

时间限制:2000MS

内存限制:524288KB

Description

Zrn神犇最近喜欢上一款折纸游戏,因此他几乎每天都拿着一条悠长悠长又寂寥的纸带折来折去。其具体规则是这样的:

这是一个长度为N,宽度为1的纸条,从1开始写着连续的N个自然数。

1 2 3 4 5 6 N

如果它的长度为偶数,Zrn神犇则会很高兴,直接把它从左往右或从右往左对折。比如长度为6的纸条从左往右对折完就会是这样:

如果它的长度为质数,Zrn神犇则会觉得不太爽,他就只能把最左端的往右折或把最右端的往左折。比如长度为5的纸条从右往左折完会变成这样:

如果它的长度是合数,Zrn神犇则会找到它最小的质因数k,把它分成相同长度的k段,按折长度为k的纸条的方法处理。

Zrn神犇就一遍又一遍地按着这个方法折,最后把这个纸条折成了一个叠在一起的小方块。

下面演示长度为15,对折和长度为质数时均从右往左折的纸条的折法:(描述可能不大清楚,请见谅)

(长度为15)

(长度为10)

(长度为5)

(长度为4)

(长度为2)

(长度为1,目标状态)

Input Format

三个数n,p1,p2,n为纸条的长度,若p1=1,对折时从左往右折,若p1=2,对折时从右往左折;若p2=1,长度为质数时折最左端,若p2=2,长度为质数时折最右端。

Output Format

N行,每行一个整数,为1~n的一个排列,表示目标状态从上到下纸片的编号。

Sample Input

15 2 2

Sample Output

2
12
9
8
13
3
4
14
7
6
15
5
10
11
1

Hint

对于20%的数据,n≤40;

对于50%的数据,n≤1000;

对于100%的数据,n≤5000000。

【题解】本来一看模拟,被数据范围吓傻了

然后经过了WZT、CYX大聚聚的教导

终于明白了-这是一题双链表。

然后就按照题目操作一下

憋了半个多小时,发现素因子被我筛错了……

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int MAX=5000010;
 4 int n,p1,p2,pr[MAX],head[MAX],next[MAX][2];
 5 int bgn,end,len;
 6 int main() {
 7     scanf("%d%d%d",&n,&p1,&p2);
 8     // p[i]: i的最大素数因子
 9     // 如果i为素数,那么p[i]=i; 反之成立
10     for (int i=2;i<=n;++i)
11         if (pr[i]==0) {
12             pr[i]=i;
13             for (int j=i*2;j<=n;j+=i)
14                 if(pr[j]==0)pr[j]=i;
15         }
16     bgn=1;end=len=n;
17     for (int i=1;i<=n;++i)
18         head[i]=i, next[i][0]=next[i][1]=0;
19     while(len!=1) {
20         int sxbk=len/pr[len];
21         if (len&1?p2==1:p1==1) {
22             for (int j=bgn+sxbk-1,k=bgn+sxbk;j>=bgn;--j,++k) {
23                 next[head[k]][k&1]=head[j];
24                 next[head[j]][j&1]=head[k];
25                 head[k]=j;
26             }
27             bgn+=sxbk;
28         }
29         else {
30             for (int j=end-sxbk+1,k=end-sxbk;j<=end;++j,--k) {
31                 next[head[k]][k&1]=head[j];
32                 next[head[j]][j&1]=head[k];
33                 head[k]=j;
34             }
35             end-=sxbk;
36         }
37         len-=sxbk;
38     }
39     for (int i=head[bgn];i;i=next[i][head[bgn]&1])
40         printf("%d\n",i);
41     return 0;
42 }

时间: 2024-11-05 01:39:48

[FZYZOJ 2162] Zrn神犇之折纸游戏的相关文章

[FZYZOJ 2132] Zrn神犇之一起来看流星雨

P2132 -- Zrn神犇之一起来看流星雨 时间限制:1000MS 内存限制:131072KB Description Zrn神犇带着妹纸来到异度空间看流星雨. 那儿有个矩形的星盘,一共有N*M格,流星雨都会落在那里.只是,那里的流星雨很奇特,都是很有节奏地.成排成排地落下的.每个时刻都会落下一排的流星,它们落在星盘上,形成了一个一个星群. 而Zrn神犇和妹纸对于星群的定义是不一样的.Zrn神犇认为,一颗星星和它周围的四个格子里的星星属于同一个星群.而妹纸认为,一颗星星和它周围的八个格子里的星

【BZOJ】1074: [SCOI2007]折纸origami

http://www.lydsy.com/JudgeOnline/problem.php?id=1074 题意:一开始有一个左上角是(0,100),右下角是(100,0)的纸片,现在可以沿有向直线折n次(n<=8,右边折向左边),折完后,有m个询问(m<=50),每次询问一个点在最终的图形中穿过了几次纸片. #include <cstdio> #include <cstring> #include <cmath> #include <string>

P2456 - 膜拜神犇

P2456 - 膜拜神犇 Description 有一个 n 个点 m 条边的有向图, 蒟蒻可以从 1 号点出发在图上走, 并且最终需要回到 1 号点. 每个点都有一个神犇( 包括 1 号点), 每次经过一个没到过的点, 蒟蒻都会膜拜那位 神犇. 蒟蒻希望膜拜尽可能多的神犇. 由于蒟蒻膜拜神犇的欲望非常强烈, 所以他可以有一次机会逆着一条有向边的方向走. ( 需要注意的是, 这条边的方向不会改变). 你现在想知道, 蒟蒻最多能膜拜多少神犇? Input 第一行 2 个整数 n. m, 分别表示图

CSS3写折纸

<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>折纸选项卡</title> <style> @-webkit-keyframes open { 0% { -webkit-transform:rotateX(-120deg);

P2300 合并神犇 DP

题目背景 loidc来到了NOI的赛场上,他在那里看到了好多神犇. 题目描述 神犇们现在正排成一排在刷题.每个神犇都有一个能力值p[i].loidc认为坐在附近的金牌爷能力参差不齐非常难受.于是loidc便想方设法对神犇们进行人道主义合并. loidc想把神犇的能力值排列成从左到右单调不减.他每次可以选择一个神犇,把他合并到两侧相邻的神犇上.合并后的新神犇能力值是以前两位犇的能力值之和.每次合并完成后,被合并的两个神犇就会消失.合并后的新神犇不能再分开(万一他俩有女朋友咋办)因此每次合并后神犇的

关于折纸的动画

其实关于折纸的重点是在HTML和CSS的布局上主要就是要一个嵌套一个,如果不是的话,会有撑开的宽高从而难以连接在一起.不过折纸还没有写完一些兼容,也是参考视频上作的小练习 <html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>无标题</title></head><bo

cogs 1656. 膜拜神犇

1656. 膜拜神犇 ★☆   输入文件:trioxorz.in   输出文件:trioxorz.out   简单对比时间限制:0.5 s   内存限制:128 MB [题目描述] bigmingod 是F.M.S信息组的组草,同时也是万人膜拜的神犇,整个年级暗恋他的女生不计其数,这让机房里的三只蒟蒻QYHDS,LZK,OIdiot羡慕嫉妒恨.为了获得像bigmingod一样的成就,这三只蒟蒻决定每次竞赛课前对他进行膜拜--三个人构成一个三角形,将bigmingod包围在内部(不包括边上),称为

【BZOJ4916】神犇和蒟蒻 杜教筛

[BZOJ4916]神犇和蒟蒻 Description 很久很久以前,有一只神犇叫yzy; 很久很久之后,有一只蒟蒻叫lty; Input 请你读入一个整数N;1<=N<=1E9,A.B模1E9+7; Output 请你输出一个整数A=\sum_{i=1}^N{\mu (i^2)}; 请你输出一个整数B=\sum_{i=1}^N{\varphi (i^2)}; Sample Input 1 Sample Output 1 1 题解:哎?上面的那个东西好像一直是1?(废话),然后 设j=i/d,

bzoj4916 神犇和蒟蒻

Description 很久很久以前,有一只神犇叫yzy; 很久很久之后,有一只蒟蒻叫lty; Input 请你读入一个整数N;1<=N<=1E9,A.B模1E9+7; Output 请你输出一个整数A=\sum_{i=1}^N{\mu (i^2)}; 请你输出一个整数B=\sum_{i=1}^N{\varphi (i^2)}; Sample Input 1 Sample Output 1 1 正解:杜教筛. 第一问答案是$1$. 第二问,先给个结论:$\varphi (n^{2})=n\va