Advertisement
a53

ABPerm

a53
May 31st, 2019
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.55 KB | None | 0 0
  1.  
  2. #include<fstream>
  3. #define MOD 1000000007
  4. using namespace std;
  5. ifstream fi("abperm.in");
  6. ofstream fo("abperm.out");
  7. int n,rez,i,tip,dr,A[100005],B[100005],PozA[100005],PozB[100005],Nr[100005],Good[100005];
  8. int Fact[100005],I[100005];
  9.  
  10. int pu(int a, int b)
  11. {
  12. int rez=1,i;
  13. for(i=0; (1<<i)<=b; i++)
  14. {
  15. if((1<<i)&b)
  16. rez=(1LL*rez*a)%MOD;
  17. a=(1LL*a*a)%MOD;
  18. }
  19. return rez;
  20. }
  21.  
  22. int comb(int n, int k)
  23. {
  24. int rez=(1LL*Fact[n]*I[n-k])%MOD;
  25. rez=(1LL*rez*I[k])%MOD;
  26. return rez;
  27. }
  28.  
  29. int main()
  30. {
  31. fi>>tip>>n;
  32. for(i=1; i<=n; i++)
  33. {
  34. fi>>A[i];
  35. PozA[A[i]]=i;
  36. }
  37. for(i=1; i<=n; i++)
  38. {
  39. fi>>B[i];
  40. PozB[B[i]]=i;
  41. }
  42. Fact[0]=1;
  43. for(i=1; i<=n; i++)
  44. Fact[i]=(1LL*Fact[i-1]*i)%MOD;
  45. I[n]=pu(Fact[n],MOD-2);
  46. for(i=n-1; i>=0; i--)
  47. I[i]=(1LL*(i+1)*I[i+1])%MOD;
  48. dr=n+1;
  49. for(i=0; i<=n; i++)
  50. {
  51. if(i>0)
  52. dr=min(dr,PozB[A[i]]);
  53. if(n-i<dr)
  54. {
  55. rez=(1LL*rez+comb(n,i))%MOD;
  56. Good[i]=1;
  57. }
  58. }
  59. if(tip==2)
  60. {
  61. for(i=1; i<=n; i++)
  62. Nr[i]=1;
  63. for(i=n-1; i>=1; i--)
  64. if(A[i+1]==B[PozB[A[i]]+1])
  65. Nr[A[i]]=1+Nr[A[i+1]];
  66. for(i=1; i<=n; i++)
  67. if(Good[PozA[i]-1] && PozA[i]+PozB[i]-2<n && Nr[i]+PozA[i]+PozB[i]-2>=n)
  68. rez=(1LL*rez-1LL*comb(PozA[i]+PozB[i]-2,PozA[i]-1)+1LL*MOD)%MOD;
  69. }
  70. fo<<rez<<'\n';
  71. fi.close();
  72. fo.close();
  73. return 0;
  74. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement