记录编号 406212 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [国家集训队 2012] 和与积 最终得分 100
用户昵称 GravatarFoolMike 是否通过 通过
代码语言 C++ 运行时间 0.583 s
提交时间 2017-05-18 09:04:20 内存使用 1.14 MiB
显示代码纯文本
  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cmath>
  4. using namespace std;
  5. typedef long long ll;
  6. const int N=1e5+10;
  7. int n,u[N],p[N],cnt;bool isp[N];
  8. void init(){
  9. u[1]=1;
  10. for (int i=2;i<N;i++){
  11. if (!isp[i]) p[++cnt]=i,u[i]=-1;
  12. for (int j=1;j<=cnt&&i*p[j]<N;j++){
  13. int x=i*p[j];isp[x]=1;
  14. if (i%p[j]) u[x]=-u[i];
  15. else{u[x]=0;break;}
  16. }
  17. u[i]+=u[i-1];
  18. }
  19. }
  20. int gcd(int x,int y){return y?gcd(y,x%y):x;}
  21. ll vio(){
  22. ll ans=0;
  23. for (int i=1;i<=n;i++)
  24. for (int j=i+1;j<=n;j++)
  25. if (!((ll)i*j%(i+j))) ans++;
  26. return ans;
  27. }
  28. ll calc(int n){
  29. ll ans=0;
  30. int m=sqrt(n);
  31. for (int b=1;b<=m;b++){
  32. int N=n/b,right=min(N,b*2-1);
  33. for (int l=b+1,r;l<=right;l=r+1){
  34. r=min(N/(N/l),right);
  35. ans+=(r-l+1)*(N/l);
  36. }
  37. }
  38. /*for (int a=1;a<=m*2;a++)
  39. for (int b=a/2+1;b<a;b++)
  40. ans+=n/((ll)b*a);
  41. for (int b=1;b<=m;b++)
  42. for (int a=b+1;a<b*2;a++)
  43. ans+=n/((ll)b*a);*/
  44. return ans;
  45. }
  46. int main()
  47. {
  48. freopen("nt2012_calc.in","r",stdin);
  49. freopen("nt2012_calc.out","w",stdout);
  50. init();
  51. scanf("%d",&n);
  52. //printf("%lld\n",vio());
  53. ll ans=0;
  54. for (int l,r=sqrt(n);r;r=l-1){
  55. int k=n/r/r;
  56. l=sqrt(n/(k+1))+1;
  57. //printf("k=%d [%d,%d]\n",k,l,r);
  58. ans+=(u[r]-u[l-1])*calc(k);
  59. }
  60. //for (int d=1;(ll)d*d<=n;d++)
  61. // if (u[d]) ans+=u[d]*calc(n/d/d);
  62. printf("%lld\n",ans);
  63. return 0;
  64. }