打表或者画个图可以看出i>根号n时每个i的贡献值相差很小,可以利用公式优化(函数C)

但是注意不能一整段使用公式,否则复杂度还是会劣化到O(n)(显然对gongxian只能逐步递减)

网上看了不少代码,但是都没有对贡献值边界问题给定明确的判断

所以还是加多一个while循环确定贡献值的开端是前面的n/i没有的

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int maxn = 1e5+11;
  4. typedef long long ll;
  5. ll H(ll n,ll j){
  6. ll ans=0;
  7. for(int i = 1; i <= j; i++) ans+=n/i;
  8. return ans;
  9. }
  10. ll C(ll n,ll gongxian){
  11. return gongxian*(n/gongxian-n/(gongxian+1));
  12. }
  13. int main(){
  14. int T,kase=0; scanf("%d",&T);
  15. while(T--){
  16. ll n; scanf("%lld",&n);
  17. if(n<=20){
  18. printf("Case %d: %lld\n",++kase,H(n,n));
  19. continue;
  20. }
  21. ll gen = sqrt(n);
  22. ll ans1 = H(n,gen);
  23. ll tmp = n/gen;
  24. ll cnt=gen;
  25. while(1){
  26. if(n/gen==n/(cnt+1)){
  27. ans1+=n/gen;
  28. cnt++;
  29. }
  30. else{
  31. cnt++;//start
  32. break;
  33. }
  34. }
  35. ll gongxian = n/cnt;
  36. ll ans2=0;
  37. while(gongxian){
  38. ans2+=C(n,gongxian);
  39. gongxian--;
  40. }
  41. printf("Case %d: %lld\n",++kase,ans1+ans2);
  42. }
  43. return 0;
  44. }

顺便附加对规律观察用的代码

  1. #include<bits/stdc++.h>
  2. #define rep(i,j,k) for(int i = j; i <= k; i++)
  3. #define scan(a) scanf("%d",&a)
  4. using namespace std;
  5. typedef pair<int,int> P;
  6. const int maxn = 1e6+11;
  7. typedef long long ll;
  8. int cnt[maxn],n;
  9. bool C(int n){
  10. memset(cnt,0,sizeof cnt);
  11. rep(i,1,n) cnt[n/i]++;
  12. int maxzero=0,num=0;
  13. rep(i,1,n) if(i>=sqrt(n)&&cnt[i]==1) num++;
  14. // cout<<(int)sqrt(n+0.5)+1<<" "<<cnt[(int)sqrt(n+0.5)+1]<<endl;
  15. // return cnt[(int)sqrt(n+0.5)+1];
  16. cout<<num<<endl;
  17. }
  18. int main(){
  19. // rep(i,1,10000) if(C(i)) cout<<i<<endl;
  20. srand(time(NULL));
  21. int n=rand()%1000000;
  22. C(n);cout<<sqrt(n)<<endl;
  23. }

可以看出[根号n,n]对答案的贡献基本等于根号n

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int main(){
  4. int cnt=0;
  5. for(int i = 100; i <= 1e6; i++){
  6. int a=i/(int)sqrt(i),b=sqrt(i);
  7. if(a-b<0) cnt++;
  8. // cout<<i<<" "<<a-b<<endl;
  9. }
  10. cout<<cnt<<endl;
  11. }

可以看出a(应该)都是大于等于b

待做同类题目:1257 2956

  1. //BACKUP
  2. #include<bits/stdc++.h>
  3. using namespace std;
  4. const int maxn = 1e5+11;
  5. typedef long long ll;
  6. ll cal(int n,int k){
  7. ll ans=0;
  8. for(int i = 1; i <= n; i++) ans+=k%i;//k-(k/i)*i
  9. return ans;
  10. }
  11. ll G(int n,int k){
  12. ll ans=0;
  13. for(int i = 1; i <= n; i++) ans+=(k/i)*i;
  14. return ans;
  15. }
  16. ll con(ll k,ll i){return i*(k/i-k/(i+1));}
  17. ll sum(ll a1,ll n,ll d){return a1+(n-1)*d;}
  18. int main(){
  19. int n,k;
  20. while(cin>>n>>k){
  21. if(n<=100){
  22. cout<<cal(n,k)<<endl;
  23. continue;
  24. }
  25. ll root=sqrt(n);
  26. // cout<<"root"<<root<<endl;
  27. ll ans1=1ll*k*n;
  28. ll ans2=G(root,k); //
  29. ll ans3=0;
  30. int cnt=root+1;
  31. if(k/cnt==0){//防止越界处理
  32. cout<<ans1-G(root,k)<<endl;
  33. continue;
  34. }
  35. while(1){
  36. if(k/root==k/(cnt+1)){
  37. ans3+=(k/(cnt+1))*(cnt+1);
  38. cnt++;
  39. // cout<<k/root<<" "<<k/cnt<<endl;
  40. }
  41. else{
  42. cnt++;
  43. break;
  44. }
  45. }
  46. bool flag=0;
  47. ll lim=k/n; if(lim==0) lim++;
  48. ll val=k/cnt; if(val==0) flag=1;
  49. ll now=cnt;
  50. ll ans4=0;
  51. while(!flag&&val>=lim){
  52. cout<<"NOW "<<now<<endl;
  53. ll LEN = k/val-k/(val+1);
  54. cout<<"LEN "<<LEN<<endl;
  55. cout<<"VAL "<<val<<endl;
  56. ans4+=con(k,val)*(LEN?sum(now,LEN,1):0);
  57. now+=LEN;
  58. val--;
  59. }
  60. cout<<ans1-(ans2-ans3-ans4)<<endl;
  61. }
  62. return 0;
  63. }

LightOJ - 1245 根号n暴力的更多相关文章

  1. LightOJ 1245 数学题,找规律

    1.LightOJ 1245   Harmonic Number (II)   数学题 2.总结:看了题解,很严谨,但又确实恶心的题 题意:求n/1+n/2+....+n/n,n<=2^31. ...

  2. LightOJ 1245 Harmonic Number (II)(找规律)

    http://lightoj.com/volume_showproblem.php?problem=1245 G - Harmonic Number (II) Time Limit:3000MS    ...

  3. lightoj 1245

    lightoj 1245 Harmonic Number (II) 题意:给定一个 n ,求 n/1 + n/2 + …… + n/n 的值(这里的 "/" 是计算机的整数除法,向 ...

  4. LightOJ - 1234 LightOJ - 1245 Harmonic Number(欧拉系数+调和级数)

    Harmonic Number In mathematics, the nth harmonic number is the sum of the reciprocals of the first n ...

  5. LightOJ 1245 - Harmonic Number (II)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1245 题意:仿照上面那题他想求这么个公式的数.但是递归太慢啦.让你找公式咯. ...

  6. LightOj 1245 --- Harmonic Number (II)找规律

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1245 题意就是求 n/i (1<=i<=n) 的取整的和这就是到找规律的题 ...

  7. Harmonic Number (II) LightOJ - 1245 (找规律?。。。)

    题意: 求前n项的n/i  的和 只取整数部分 暴力肯定超时...然后 ...现在的人真聪明...我真蠢 觉得还是别人的题意比较清晰 比如n=100的话,i=4时n/i等于25,i=5时n/i等于20 ...

  8. lightoj 1245 Harmonic Number (II)(简单数论)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1245 题意:求f(n)=n/1+n/2.....n/n,其中n/i保留整数 显 ...

  9. LightOJ 1245 Harmonic Number (II) 水题

    分析:一段区间的整数除法得到的结果肯定是相等的,然后找就行了,每次是循环一段区间,暴力 #include <cstdio> #include <iostream> #inclu ...

随机推荐

  1. Docker学习笔记_进入正在运行的Docker容器

    如何进入正在运行的Docker容器? 这里记录一种方法. 1.先查看container ID,并确认这个容器已经启动 docker ps -a       #列出懿创建的所有容器 docker ps ...

  2. Linux PulseAudio

    一.简介 Linux的声音系统或许是最无序的子系统部分!作为Server来说,声音无足轻重,无人问津,而作为桌面来说太多的实现方案,各有各的长出和不足,ALSA经过多年的发展,基本统一了Linux声卡 ...

  3. 34.UCASE() LCASE() 函数

    UCASE() 函数 UCASE 函数把字段的值转换为大写. SQL UCASE() 语法 SELECT UCASE(column_name) FROM table_name SQL UCASE() ...

  4. Classification and Prediction

    # coding: utf-8 # In[128]: get_ipython().magic(u'matplotlib inline') import pandas as pd from pandas ...

  5. Python3 网络爬虫开发实战学习弱点书签

    1. urllib.robotparse模块对robot.txt文件的解析,can_fetch()方法和parse()方法. Page121 2. lxml.etree模块自动补全Html代码,Htm ...

  6. 方向ajax(http long request实现实时通信)

    现在我们就要通过这种方法来实现实时通信,先说一下原理: 客户端发起一个ajax长链接查询,然后服务端就开始执行代码,主要是检查某个文件是否被更新,如果没有,睡一会(sleep),醒来接着检查 如果客户 ...

  7. docker搭建gitbook服务

    Gitbook Gitbook简介 GitBook 是一个基于 Node.js 的命令行工具,可使用 Github/Git 和 Markdown 来制作精美的电子书,GitBook 并非关于 Git ...

  8. (转)EASYUI+MVC4通用权限管理平台

    原文地址:http://www.cnblogs.com/hn731/archive/2013/07/15/3190947.html 通用权限案例平台在经过几年的实际项目使用,并取得了不错的用户好评.在 ...

  9. (转)Asp.Net生命周期系列三

    原文地址:http://www.cnblogs.com/skm-blog/p/3178862.html 上文讲到了HttpRunTime主要做了三个事情,我们先回忆一下. 第一:雇佣了项目经理(Htt ...

  10. 如何杀死一个已经detached的screen会话?

    如果向杀死一个已经detached的screen会话,可以使用以下命令: screen -X -S seesion-id quit 举例如下: [root@localhost ~]# screen - ...