模拟 nbut1225 NEW RDSP MODE I
来源:互联网 发布:心理学入门 知乎 编辑:程序博客网 时间:2024/05/01 08:33
传送门:点击打开链接
题意:输入n,m,x,刚开始有一个1~n的排列,然后定义了一种操作,是将数组中的偶数位数字选出来,按照顺序放到数组最前面,奇数位按照顺序放到偶数位的后面,进行m次这样的操作,输出之后前x个数字
思路:找到循环节T,利用T去约m,然后再将很小的m拿去模拟,输出前x个
一开始就想到找循环节,,刚开始只想到去用找规律的方法去找到通项公式,但是找了好久就是没找到,虽然感觉理论上肯定是有的T^T
但是找规律的时候发现了很多特点:T一定小于等于n,还有就是最刚开始的时候数字1是在第一个位置,当数字1再次出现在第一个位置的时候,刚好就是一个循环节!
所以,我们只需要模拟1的位置,一直模拟到1出现在第一个位置时,循环节就算出来了。复杂度O(n),1的位置还是很好模拟的,因为只研究了一个数字而已,还是很好找到递推式子的。找到循环节T之后,我们令m=m%T.这样m就变成<=n的了,然后就可以再次模拟
接下来,我们对前x个数字,分别倒着模拟m次,因为现在的m<=n,所以复杂度O(xn),倒着模拟的公式也是很好找的
最后看别人的代码才发现,,其实模拟的时候,就是一个快速幂(fuck)
总之,还是有些感慨,有时候不一定模拟就非要找到通项公式,找到办法能在较短的时间内算出通项公式,这样也并不算差~
#include<map>#include<set>#include<cmath>#include<stack>#include<queue>#include<cstdio>#include<string>#include<vector>#include<cstring>#include<iostream>#include<algorithm>#include<functional>#define FIN freopen("input.txt","r",stdin)#define FOUT freopen("output.txt","w+",stdout)using namespace std;typedef long long LL;typedef pair<int, int> PII;const int MX = 1e5 + 5;const int INF = 0x3f3f3f3f;int find_t(int n) { int p = 1, ret = 0; while(true) { ret++; if(p % 2) p = n / 2 + (p + 1) / 2; else p = p / 2; if(p == 1) return ret; }}int solve(int p, int n, int m) { for(int i = 1; i <= m; i++) { if(p * 2 <= n) p = p * 2; else p = (p - n / 2 - 1) * 2 + 1; } return p;}int main() { int n, m, x;//FIN; while(~scanf("%d%d%d", &n, &m, &x)) { int t = find_t(n); for(int i = 1; i <= x; i++) { printf("%d%c", solve(i, n, m % t), i == x ? '\n' : ' '); } } return 0;}
0 0
- 模拟 nbut1225 NEW RDSP MODE I
- NBUT1225 NEW RDSP MODE I(快速幂,规律)
- 1060: NEW RDSP MODE I
- NEW RDSP MODE I (模拟,循环节)
- wustoj 1093 NEW RDSP MODE I
- NBUT 1225 NEW RDSP MODE I
- NBUT 1225 NEW RDSP MODE I
- NBUT 1225 NEW RDSP MODE I
- NEW RDSP MODE I (找规律)
- 【省赛个人选拔赛九补题】NBUT [1225] NEW RDSP MODE I (思路题)
- NBUT 1225 NEW RDSP MODE I(找规律)(快速幂)
- NEU 1010: NEW RDSP MODE I 数论 每次将交换把偶数位的拖到前面,奇数位的拖到最后面
- NEU 1010: NEW RDSP MODE I 数论 每次将交换把偶数位的拖到前面,奇数位的拖到最后面
- FZU1062 NBUT1225
- How do I remove files saying “old mode 100755 new mode 100644” from unstaged changes in Git?
- git 报错 How do I remove files saying “old mode 100755 new mode 100644” from unstaged changes in Git?
- 日本“i-mode”全球化
- IE 收藏[ i-mode]
- 《花千骨》为何被批“脑残”还能创造收视神话?
- 我不知道该怎么去做
- redis cluster 集群重启关闭
- Android:对话框(12种:警告对话框&进度条对话框&日期对话框&时间对话框)
- jor(1):简表(JOR)开源的报表工具调研
- 模拟 nbut1225 NEW RDSP MODE I
- 新手必须知道的13个Xcode小技巧
- 2015多校联合第十场 hdu5414CRB and String字符串思维题
- 鸟哥的Linux私房菜-----14、磁盘配额
- 自定义控件(五)禁止滑动的ViewPager
- CAS服务端取消https验证
- C/C++编程细节(一)——你未必知道
- 堆区和栈区的区别
- 同一个变量打印char类型和unsigned char 类型,引发的思考