Advertisement
a53

fibodiv

a53
Nov 29th, 2017
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.36 KB | None | 0 0
  1. // prof. Ciprian Chesca - Fibonacci + PINEX cu generare submultimi
  2. // 100 puncte
  3.  
  4.  
  5. #include <fstream>
  6.  
  7. #define nmax 101
  8. #define ll long long
  9.  
  10. using namespace std;
  11.  
  12. ifstream f("fibodiv.in");
  13. ofstream g("fibodiv.out");
  14.  
  15. ll n,t;
  16. ll per[nmax],a[nmax],st[nmax];
  17. ll sol=0;
  18.  
  19. // calculez perioada restransa a aparitiei unui termen divizibil cu a[1]..a[n] in sirul Fibonacci
  20. void perioada(ll n)
  21. {
  22. ll x,y,z,p,i;
  23. bool ok;
  24.  
  25. for(i=1;i<=n;i++)
  26. {
  27. x=1;y=1;ok=false;p=2;
  28. while (!ok)
  29. {
  30. z=(x+y)%a[i];
  31. x = y;
  32. y = z;
  33. p++;
  34. if (z==0) {per[i]=p;ok=true;}
  35. }
  36. }}
  37.  
  38.  
  39. ll cmmdc(ll a, ll b)
  40. {
  41. ll d=a,i=b,r=d%i;
  42. while (r)
  43. {
  44. d=i;
  45. i=r;
  46. r=d%i;
  47. }
  48. return i;
  49. }
  50.  
  51.  
  52. ll n_cmmmc(ll x[], ll n)
  53. {
  54. ll i,w = x[1];
  55. for(i=2;i<=n;i++)
  56. w=(w*x[i])/cmmdc(w,x[i]);
  57.  
  58. return w;
  59. }
  60.  
  61.  
  62. void inout(ll k)
  63. {
  64. ll p = n_cmmmc(st,k);
  65. if (k%2==0) sol-=t/p;
  66. else sol+=t/p;
  67. }
  68.  
  69.  
  70. void parti()
  71. {
  72. ll i,j,k,l = 1 << n; // l = 2^n
  73. for(i=1;i<l;i++)
  74. {
  75.  
  76. k=0;
  77. for(j=0;j<n;j++)
  78. if ((i>>j) & 1)
  79. st[++k]=per[j+1];
  80. inout(k);
  81.  
  82.  
  83. }
  84. }
  85.  
  86.  
  87. int main()
  88. {
  89. ll i;
  90.  
  91. f>>n>>t;
  92. for(i=1;i<=n;i++)
  93. f >> a[i];
  94.  
  95.  
  96. perioada(n);
  97.  
  98. parti();
  99.  
  100. g<<sol<<"\n";
  101.  
  102.  
  103. f.close();
  104. g.close();
  105. return 0;
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement