辉夜的序列
【题目背景】
又是某高中学生会无聊的一天,辉夜同学由于实在太闲,在摆弄她的 n 颗巧克力
【问题描述】
突然,由于某种神秘力量,她的巧克力形成了一个神秘序列。她看到这个神秘
的序列,想到了一条水题。由于真的太水了,她不好意思告诉别人。但她看着你好奇
的目光,偷偷告诉了你题目。
每个巧克力都有一个可爱值 x ,x 为小于 n 的正整数,且互不相同。问最少的
操作数使巧可力的可爱值从左到右,由小到大递增。
对于每个操作,你可以取出一部分巧克力(可以不连续的子序列),按原有的顺序放到
所有巧克力的最左边。
然而出题人想起了 GDOI 拼题的优秀传统(想起了被 网络流拼SAM作为签到题 支配的恐
惧),想要考下快速幂。设答案为 y ,输出 y^998244355 ( y 的 998244355 次方)
对 998244353 取模
【输入格式】
第一行,一个整数 T,T<=5,表示有T组数据。
对于每组数据
第一行 1 个整数 n。
第二行 n 个整数,表示每个巧克力的可爱值,它们构成一个排列。
【输出格式】
输出一行 1 个整数表示答案。
【样例输入】
2
5
5 4 3 2 1
4
1 2 3 4
【样例输出】
27
0
对于第一组
第一次取 4 2,放到左边,变成 4 2 5 3 1
第二次取 2 3,放到左边,变成 2 3 4 5 1
第三次取 1, 放到左边,变成 1 2 3 4 5
【数据范围】
序号 n的最大值
1 5
2 10
3 20
4 50
5 100
6 1000
7 1000
8 2000
9 100000
10 200000
对于第3,6个测试点,满足 x 单调递减
题解: 玄学算法石锤了!who能想到二进制。。。。
每个数取二进制再-1。从低位向高位不断“找”。
只要这一位是0就把提到最前面。
然后如果两个数有序,后一数字的二进制和前面数字一样。
(可能还是不懂,举个例子哈,图片有点透明,但还是能看清的)
ps:原文的快速幂其实就是这个数立方…太玄学!
附上更玄学的代码
#include <bits/stdc++.h> using namespace std; #define mmst(a, b) memset(a, b, sizeof(a)) #define mmcp(a, b) memcpy(a, b, sizeof(b)) typedef long long LL; const int N=300300; int T,n,num[N],ans,tu; int main() { freopen("kaguya1.in", "r", stdin); freopen("kaguya1.ans", "w", stdout); cin>>T; while(T--) { tu=ans=0; cin>>n; for(int i=1;i<=n;i++) { int x; scanf("%d",&x); num[x]=i; } for(int i=2;i<=n;i++) if(num[i]<num[i-1]) ans++; while(ans) { ans/=2; tu++; } cout<<tu*tu*tu<<endl; } return 0; }