题目链接:cf501D
题意:给出两个0~n-1的全排列,n<=200000,假设两个全排列分别是第x,y个全排列,现在要你计算第(x+y)%(n!)个全排列,并输出。
好久以前做的了,咕咕咕了好久,比赛打完了来更一下。
变进制数的概念请见这里:yummy的博客
大概有两个应用:
- 将一个全排列转化为变进制数,变进制数转为十进制算出第几个全排列。
- 变进制数转化为全排列。
该题先算出两个变进制数,然后变进制数相加,模对应进制。
int t=0;
for(int i=n,mod=1;i>=1;--i,++mod){
int h=t+A[i]+B[i];
p[i]=h%mod;
t=h/mod;
}
然后再转为全排列即可。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+7;
int sum[maxn];
int n;
void add(int x,int y){
for(;x<=n;x+=x&-x) sum[x]+=y; }
int ask(int x){
if(x==0) return 0; int res=0; for(;x;x-=x&-x) res