首页 > 代码库 > 康拓展开-----两个排列的位置之差
康拓展开-----两个排列的位置之差
#include <iostream>#include <cstring>#include <cstdio>#define LL long longusing namespace std;const int maxn=105;const int mod=1e6+7;int T,n,a[maxn],b[maxn];LL fac[maxn];int vis[maxn];void set(int high){ fac[0]=1; for(int i=1;i<=high;i++) fac[i]=(fac[i-1]*i)%mod;}void deal(int a[],LL &ans){ ans=0; memset(vis,0,sizeof(vis)); for(int i=0;i<n;i++) { int cnt=0; for(int j=1;j<a[i];j++) if(!vis[j]) cnt++; ans=(ans+((cnt*fac[n-i-1])%mod))%mod; vis[a[i]]=1; }}int main(){ set(100); int Case=1; cin>>T; while(T--) { cin>>n; for(int i=0;i<n;i++) cin>>a[i]; for(int i=0;i<n;i++) cin>>b[i]; LL p1=0,p2=0,ans=0; deal(a,p1);deal(b,p2); int i=0; for(i=0;i<n;i++) if(a[i]!=b[i]) break; if(a[i]>b[i]) ans=(p1-p2)%mod; else ans=(p2-p1)%mod; cout<<"Case $"<<Case++<<":"<<endl<<(ans+mod)%mod<<endl; } return 0;}#include <iostream>#include <cstring>#include <cstdio>#define LL long longusing namespace std;const int maxn=105;const int mod=1e6+7;int T,n,a[maxn],b[maxn];LL fac[maxn];int vis[maxn];void set(int high){ fac[0]=1; for(int i=1;i<=high;i++) fac[i]=(fac[i-1]*i)%mod;}void deal(int a[],LL &ans){ ans=0; memset(vis,0,sizeof(vis)); for(int i=0;i<n;i++) { int cnt=0; for(int j=1;j<a[i];j++) if(!vis[j]) cnt++; ans=(ans+((cnt*fac[n-i-1])%mod))%mod; vis[a[i]]=1; }}int main(){ set(100); int Case=1; cin>>T; while(T--) { cin>>n; for(int i=0;i<n;i++) cin>>a[i]; for(int i=0;i<n;i++) cin>>b[i]; LL p1=0,p2=0,ans=0; deal(a,p1);deal(b,p2); int i=0; for(i=0;i<n;i++) if(a[i]!=b[i]) break; if(a[i]>b[i]) ans=(p1-p2)%mod; else ans=(p2-p1)%mod; cout<<"Case $"<<Case++<<":"<<endl<<(ans+mod)%mod<<endl; } return 0;}
康拓展开-----两个排列的位置之差
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。