首页 > 其他分享 >CF 1677D(Tokitsukaze and Permutations-冒泡排序)

CF 1677D(Tokitsukaze and Permutations-冒泡排序)

时间:2022-10-24 13:03:53浏览次数:72  
标签:jie return int ll Permutations 冒泡排序 Tokitsukaze inj define


已知长度为n的排列,经过k次冒泡(每次把最大的数交换到最后)后,得到的新序列为.

现在已知的某些地方的值,不知道的记
求合法原排列数。

考虑和排列达成双射关系。
且1次冒泡会导致序列整体左移,并减1(若为0则不减)。最后添1位0
也即是

for(int i=1;i<n;i++)
v[i]=min(v[i+1]-1,0);
v[n]=0;

因此序列对应的原排列数为
无解条件为

#include<bits/stdc++.h>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=next[p])
#define Lson (o<<1)
#define Rson ((o<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,0x3f,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define MEMx(a,b) memset(a,b,sizeof(a));
#define INF (0x3f3f3f3f)
#define F ( 998244353)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define vi vector<int>
#define pi pair<int,int>
#define SI(a) ((a).size())
#define Pr(kcase,ans) printf("Case #%d: %lld\n",kcase,ans);
#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;
#define PRi2D(a,n,m) For(i,n) {\
For(j,m-1) cout<<a[i][j]<<' ';\
cout<<a[i][m]<<endl;\
}
#pragma comment(linker,"/STACK:102400000,102400000")
#define ALL(x) (x).begin(),(x).end()
#define gmax(a,b) a=max(a,b);
#define gmin(a,b) a=min(a,b);
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return ((a-b)%F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
inline int read()
{
int x=0,f=1; char ch=getchar();
while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
int n,m;
int v[1123456];
#define MAXN (1123456)
ll inj[MAXN],jie[MAXN];
inline int C(int a,int b) {
return (ll)jie[a]*inj[b]%F*inj[a-b]%F;
}inline int P(int a,int b) {
return (ll)jie[a]*inj[a-b]%F;
}
ll p=F;
inline int pow2(int a,ll b) //a^b mod p
{
if (b==0) return 1%p;
int c=pow2(a,b/2);
c=(ll)c*c%p;
if (b&1) c=(ll)c*a%p;
return c;
}
void pre(int n) {
jie[0]=1;For(i,n) jie[i]=mul(jie[i-1],i);
inj[0]=inj[1]=1;Fork(i,2,n) inj[i]=(F-(F/i))*inj[F%i]%F;
For(i,n) inj[i]=mul(inj[i],inj[i-1]);
}
ll a[1123456];
ll calc() {
int n=read(),k=read();
For(i,n) v[i]=read();
Fork(i,n-k+1,n) if(v[i]>0) return 0;
For(i,n-k) if(v[i]>i-1) return 0;
ll p=jie[k];
For(i,n-k) if(v[i]==0) p=p*(k+1)%F;
else if(v[i]==-1) p=p*(i+k)%F;
return p;

}
int main()
{
// freopen("D.in","r",stdin);
// freopen(".out","w",stdout);
pre(1e6);
int T=read();
while(T--) {
cout<<calc()<<endl;
}
return 0;
}


标签:jie,return,int,ll,Permutations,冒泡排序,Tokitsukaze,inj,define
From: https://blog.51cto.com/u_15724837/5789444

相关文章

  • TEMPLATE3. Permutations 排列
    TEMPLATE3.Permutations组合,可以乱序。所以,需要记录哪些数用过了。每次递归时,选用第一个没用过的数。注意回溯时清空标记。//TEMPLATE3.Permutations#include<bits......
  • Demo45_冒泡排序
    packagecom.HuanXin.CeShi;importjava.util.Arrays;publicclassD{publicstaticvoidmain(String[]args){int[]AA={1,3,5,8};//11-1=10......
  • 逻辑知识:冒泡排序算法
     前言在软件开发中,冒泡排序对于一些软件开发工程师很常用,而且它也是一种比较经典的算法之一,那么本节就来说说这个冒泡排序。冒泡排序概念冒泡排序(BubbleSort),是一种计算......
  • JavaScript 实现 -- 冒泡排序
    冒泡排序冒泡排序(BubbleSort)也叫气泡排序、泡沫排序,是一种比较简单的排序算法。它通过遍历数组,比较相邻的两个元素,如果前一个元素比后一个元素大,则交换它们的位置,这样第......
  • 选择排序与冒泡排序(c语言+Java语言)
    选择排序O(n2)首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。重复第二步,直到所有元素......
  • 冒泡排序自写
    /***冒泡排序*/publicvoidcodeGgt1(){int[]a={4,2,6,8,9,3,6,0};for(intj=a.length;j>1;j--){for(inti=0;i<a.length-1;i++){if(a[i]>......
  • 数组-冒泡排序
    packagecom.beijing.xiaowen.Array;importjava.util.Arrays;publicclassTest01{publicstaticvoidmain(String[]args){//冒泡排序int......
  • 嵌入式-c语言基础:冒泡排序实现从大到小排列
    #include<stdio.h>intmain(){/*冒泡排序:从大到小*//*i=0第1轮(i+1):需要比较9次(sizeArr-i-1)*//*i=1第2轮(i+1):需要比较8次(sizeArr-i-1)*//*i=2第3......
  • C-语言 冒泡排序
    #include<stdio.h>#include<stdlib.h>/*runthisprogramusingtheconsolepauseroraddyourowngetch,system("pause")orinputloop*/intmain(intargc,c......
  • 冒泡排序、交换排序与快速排序
    冒泡排序思路:比如:3,5,6,2,4,7结果:2,3,4,5,6,7publicclassBubbleSort{publicstaticvoidmain(String[]args){int[]a=newint[]{3,5,6,2,4,7};......