Advertisement
Guest User

Untitled

a guest
Jan 18th, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.25 KB | None | 0 0
  1. #include <fstream>
  2. #include <iostream>
  3. #include <algorithm>
  4. #include <iomanip>
  5. #include <set>
  6. #include <vector>
  7. #include <cmath>
  8. #include <map>
  9.  
  10.  
  11. using namespace std;
  12.  
  13. void solve();
  14.  
  15. int main()
  16. {
  17. ios::sync_with_stdio(0);
  18. solve();
  19. }
  20.  
  21.  
  22.  
  23. #define double long double
  24. const int MAXN = 1e8;
  25. const int MAXdiv = sqrt(MAXN);
  26. vector<int> myprime;
  27.  
  28. int p[MAXN];
  29.  
  30. void get_prime()
  31. {
  32. for (int i = 4; i<=MAXN/2; i+=2)
  33. p[i] = 1;
  34. for (int i = 3; i<=MAXN/3; i+=2)
  35. if (p[i]==0)
  36. {
  37. myprime.push_back(i);
  38. if (i<=1e4)
  39. for (int j = i*i; j<MAXN; j+=i)
  40. p[j] = 1;
  41. }
  42. }
  43.  
  44.  
  45. const int kol = 7;
  46. int border[] = {100,1000,10000,100000,1000000,10000000,100000000};
  47. double graph[kol];
  48. int cnt[kol];
  49. int len = MAXN/kol;
  50. void update(int n, double res)
  51. {
  52. // out << fixed << setprecision(15) << n << " "<< res << endl;
  53. for (int i =0; i<kol; i++)
  54. {
  55. if (border[i]>=n)
  56. {
  57. cnt[i]++;
  58. graph[i]+=res;
  59. break;
  60. }
  61. }
  62. }
  63.  
  64. int gcd(int a, int b)
  65. {
  66. while (a)
  67. {
  68. b%=a;
  69. swap(a,b);
  70. }
  71. return b;
  72. }
  73. vector<int> dividers(int div1, int div2)
  74. {
  75. int g = gcd(div1,div2);
  76.  
  77. vector<int> res;
  78. for (int i = 1; i*i<=g; i++)
  79. {
  80. if (g%i==0)
  81. {
  82. res.push_back(i);
  83. if (g/i!=i)
  84. res.push_back(g/i);
  85. }
  86. }
  87. return res;
  88. }
  89.  
  90. int phi[MAXdiv];
  91. void count_phi(int n, int pr, int pk, int pkminus1, int last)
  92. {
  93. phi[n] = pr*(pk-pkminus1);
  94. for (int i = max(0,last); i<myprime.size(); i++)
  95. {
  96. int nextphi = n*myprime[i];
  97. if (nextphi>=MAXdiv)
  98. return;
  99.  
  100. if (i==last)
  101. {
  102. int pkm1 = 0;
  103. if (pkminus1==0)
  104. pkm1 = 1;
  105. else
  106. pkm1 = pkminus1*myprime[i];
  107. count_phi(nextphi,pr,pk*myprime[i],pkm1,i);
  108. }
  109. else
  110. {
  111. count_phi(nextphi, phi[n], myprime[i], 1, i);
  112. }
  113. }
  114. }
  115. int Phi(int n)
  116. {
  117. return phi[n];
  118. }
  119. const int maxpow = 10;
  120. vector<vector<int>> getclasses(vector<int> D)
  121. {
  122. vector<char>used(D.size());
  123. vector<vector<int>>bin(maxpow);
  124. for (int b = maxpow-1; b>=0; b--)
  125. {
  126. for (int i = 0; i<D.size(); i++)
  127. {
  128. if (used[i])
  129. continue;
  130. if ((D[i] & ( (1ll<<b)-1))==0) // это проверка на делимость
  131. {
  132. bin[b].push_back(D[i]);
  133. used[i] = 1;
  134. }
  135. }
  136. }
  137.  
  138. return bin;
  139.  
  140. }
  141. int s[maxpow];
  142.  
  143. int calc_pq(int p, int q)
  144. {
  145. vector<int> D = dividers(p-1, q-1);
  146. vector<vector<int>> bin = getclasses(D);
  147. int ans = 0;
  148. for (int i = 0; i<maxpow; i++)
  149. {
  150. s[i] = 0;
  151. for (int j = 0;j<bin[i].size(); j++)
  152. s[i]+=Phi(bin[i][j]);
  153.  
  154. ans+=s[i]*s[i];
  155. }
  156. return ans;
  157. }
  158.  
  159. void gen_pq()
  160. {
  161. int sz = myprime.size();
  162. for (int i = 0; i<sz-1; i++)
  163. {
  164. if (myprime[i]*myprime[i+1]>MAXN)
  165. break;
  166. // cerr << myprime[i] << endl;
  167. for (int j = i+1; j<sz; j++)
  168. {
  169. if (myprime[i]*myprime[j]>MAXN)
  170. break;
  171. int n = myprime[i]*myprime[j];
  172. int x = calc_pq(myprime[i],myprime[j]);
  173. int phi = (myprime[i]-1)*(myprime[j]-1);
  174. update(n,1.0*x/phi);
  175.  
  176. }
  177.  
  178. }
  179. }
  180.  
  181.  
  182.  
  183.  
  184. int calc_pqr(int p, int q, int r)
  185. {
  186. int n = p*q*r;
  187. vector<int> divP = dividers(p-1, n/p-1);
  188. vector<int> divQ = dividers(q-1, n/q-1);
  189. vector<int> divR = dividers(r-1, n/r-1);
  190.  
  191. vector<vector<int>> bin1 = getclasses(divP);
  192. vector<vector<int>> bin2 = getclasses(divQ);
  193. vector<vector<int>> bin3 = getclasses(divR);
  194. int ans = 0;
  195.  
  196. for (int i = 0; i<maxpow; i++)
  197. {
  198. if (bin1[i].size() == 0||
  199. bin2[i].size() == 0||
  200. bin3[i].size() == 0)
  201. continue;
  202. int s1 = 0,s2 = 0, s3 = 0;
  203.  
  204. for (int j = 0; j<bin1[i].size(); j++)
  205. s1+=Phi(bin1[i][j]);
  206.  
  207. for (int j = 0; j<bin2[i].size(); j++)
  208. s2+=Phi(bin2[i][j]);
  209.  
  210. for (int j = 0; j<bin3[i].size(); j++)
  211. s3+=Phi(bin3[i][j]);
  212.  
  213. ans+=s1*s2*s3;
  214. }
  215. return ans;
  216. }
  217.  
  218.  
  219.  
  220. void gen_pqr()
  221. {
  222. int sz = myprime.size();
  223. for (int i = 0; i<sz-2; i++)
  224. {
  225. if (myprime[i]*myprime[i+1]*myprime[i+2]>MAXN)
  226. break;
  227.  
  228. // cerr << myprime[i] << endl;
  229. for (int j = i+1; j<sz-1; j++)
  230. {
  231. if (1ll*myprime[i]*myprime[j]*myprime[j+1]>MAXN)
  232. break;
  233. for (int k = j+1; k<sz; k++)
  234. {
  235. int n = myprime[i]*myprime[j]*myprime[k];
  236. if (n>MAXN)
  237. break;
  238. int x = calc_pqr(myprime[i],myprime[j],myprime[k]);
  239. int phi = (myprime[i]-1)*(myprime[j]-1)*(myprime[k]-1);
  240. update(n,1.0*x/phi);
  241.  
  242. }
  243.  
  244. }
  245.  
  246. }
  247. }
  248. void solve()
  249. {
  250. double starttime = clock();
  251.  
  252. get_prime();
  253. double endtime = clock();
  254. cout <<" для генерации простых чисел понадобилось "<< (endtime-starttime)/CLOCKS_PER_SEC << endl;
  255. starttime = clock();
  256. count_phi(1, 1, 1, 0, -1);
  257. endtime = clock();
  258. cout <<" для подсчета функции эйлера понадобилось "<< (endtime-starttime)/CLOCKS_PER_SEC << endl;
  259. starttime = clock();
  260. gen_pq();
  261.  
  262. endtime = clock();
  263.  
  264. cout << "для подсчета ответа для двоек понадобилось "<< (endtime-starttime)/CLOCKS_PER_SEC << endl;
  265. starttime = clock();
  266. gen_pqr();
  267. endtime = clock();
  268. cout << " для подсчета троек понадобилось " << (endtime-starttime)/CLOCKS_PER_SEC << endl;
  269. ofstream cout("result1e8.txt");
  270. for (int i = 0; i<kol; i++)
  271. {
  272. cout <<fixed << setprecision(15)<<graph[i]/cnt[i] << endl;
  273. }
  274.  
  275. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement