Advertisement
a53

cifru

a53
Sep 19th, 2017
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.56 KB | None | 0 0
  1. #include <fstream>
  2. #include <cmath>
  3. using namespace std;
  4. int sum, l;
  5. long long sol;
  6. long x[100],u[100],a[10],o[100],k,n,m;
  7. int s[10];
  8. int maxc;
  9. long c[101][101];
  10.  
  11. int prime[100]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541};
  12.  
  13. long long perm(int k)
  14. { long long p=1;
  15. for (int i=1;i<=k;i++)
  16. p=(p*i) % 46337;
  17. return p;
  18. }
  19.  
  20. long long comb(int n,int k)
  21. {
  22. int x[100];
  23. int m=0,j,i,d;
  24.  
  25. if (k==0 || k==n) return 1;
  26.  
  27. for (i=0;i<100;i++) x[i]=0;
  28.  
  29. for (i=n-k+1;i<=n;i++)
  30. {
  31. j=i;
  32. d=0;
  33. while (j!=1)
  34. {
  35. while (j%prime[d]==0)
  36. {
  37. x[d]++;
  38. j=j/prime[d];
  39. }
  40. if (d>m)
  41. m=d;
  42. d++;
  43. }
  44. }
  45. for (i=2;i<=k;i++)
  46. {
  47. j=i;
  48. d=0;
  49. while (j!=1)
  50. {
  51. while (j%prime[d]==0)
  52. {
  53. x[d]--;
  54. j=j/prime[d];
  55. }
  56. d++;
  57. }
  58. }
  59. long long p=1;
  60. for (i=0;i<=m;i++)
  61. for (j=1;j<=x[i];j++)
  62. p=p*prime[i] % 46337;
  63.  
  64. return p;
  65. }
  66.  
  67.  
  68.  
  69. void calc(int l)
  70. { int i;
  71.  
  72. long long v,p;
  73. p=1;
  74. for (i=1;i<=9;i++)
  75. p=p*comb(a[i],s[i]);
  76.  
  77. v=p*perm(l) % 46337;
  78. v=v*perm(n-l-1) % 46337;
  79.  
  80. sol=(sol+v) % 46337;
  81. }
  82.  
  83. void back(int j,int nr)
  84. { int i;
  85. for (i=0;i<=a[j];i++)
  86. { s[j]=i; sum=sum+s[j]*j;
  87. l=l+i;
  88. if (sum<=nr)
  89. if (j<9 && sum<nr)
  90. back(j+1,nr);
  91. else
  92. if (sum==nr)
  93. calc(l);
  94. sum=sum-s[j]*j;
  95. l=l-i;
  96. }
  97.  
  98. }
  99.  
  100. main()
  101. {
  102. int v,i,t,p;
  103.  
  104. ifstream f("cifru.in");
  105.  
  106. for (i=1;i<=9;i++)
  107. a[i]=0;
  108.  
  109. maxc=0;
  110.  
  111. f>>n>>p>>k;
  112. for (i=0;i<n;i++)
  113. { f>>v; x[i]=0;
  114. u[i]=0; o[i]=0;
  115. while (v)
  116. { x[i]=x[i]*10+v%10;
  117. u[i]++;
  118. if (v%10==k)
  119. o[i]=1;
  120. v=v/10;
  121. }
  122. a[u[i]]++;
  123. m=m+u[i];
  124. }
  125.  
  126. f.close();
  127. sol=0;
  128. sum=0; l=0;
  129. for (i=0;i<n;i++)
  130. if (o[i]==1)
  131. { t=0; v=x[i]; a[u[i]]--;
  132. while (v>0)
  133. { t++;
  134. if (v%10==k)
  135. back(1,p-t);
  136. v=v/10;
  137. }
  138. a[u[i]]++;
  139. if (u[i]>maxc) maxc=u[i];
  140. }
  141. ofstream g("cifru.out");
  142. g<<sol;
  143. g.close();
  144. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement