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

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

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

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

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+11;
typedef long long ll;
ll H(ll n,ll j){
ll ans=0;
for(int i = 1; i <= j; i++) ans+=n/i;
return ans;
}
ll C(ll n,ll gongxian){
return gongxian*(n/gongxian-n/(gongxian+1));
}
int main(){
int T,kase=0; scanf("%d",&T);
while(T--){
ll n; scanf("%lld",&n);
if(n<=20){
printf("Case %d: %lld\n",++kase,H(n,n));
continue;
}
ll gen = sqrt(n);
ll ans1 = H(n,gen);
ll tmp = n/gen;
ll cnt=gen;
while(1){
if(n/gen==n/(cnt+1)){
ans1+=n/gen;
cnt++;
}
else{
cnt++;//start
break;
}
}
ll gongxian = n/cnt;
ll ans2=0;
while(gongxian){
ans2+=C(n,gongxian);
gongxian--;
}
printf("Case %d: %lld\n",++kase,ans1+ans2);
}
return 0;
}

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

#include<bits/stdc++.h>
#define rep(i,j,k) for(int i = j; i <= k; i++)
#define scan(a) scanf("%d",&a)
using namespace std;
typedef pair<int,int> P;
const int maxn = 1e6+11;
typedef long long ll;
int cnt[maxn],n;
bool C(int n){
memset(cnt,0,sizeof cnt);
rep(i,1,n) cnt[n/i]++;
int maxzero=0,num=0;
rep(i,1,n) if(i>=sqrt(n)&&cnt[i]==1) num++;
// cout<<(int)sqrt(n+0.5)+1<<" "<<cnt[(int)sqrt(n+0.5)+1]<<endl;
// return cnt[(int)sqrt(n+0.5)+1];
cout<<num<<endl;
}
int main(){
// rep(i,1,10000) if(C(i)) cout<<i<<endl;
srand(time(NULL));
int n=rand()%1000000;
C(n);cout<<sqrt(n)<<endl;
}

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

#include<bits/stdc++.h>
using namespace std;
int main(){
int cnt=0;
for(int i = 100; i <= 1e6; i++){
int a=i/(int)sqrt(i),b=sqrt(i);
if(a-b<0) cnt++;
// cout<<i<<" "<<a-b<<endl; }
cout<<cnt<<endl;
}

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

待做同类题目:1257 2956

//BACKUP
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+11;
typedef long long ll;
ll cal(int n,int k){
ll ans=0;
for(int i = 1; i <= n; i++) ans+=k%i;//k-(k/i)*i
return ans;
}
ll G(int n,int k){
ll ans=0;
for(int i = 1; i <= n; i++) ans+=(k/i)*i;
return ans;
}
ll con(ll k,ll i){return i*(k/i-k/(i+1));}
ll sum(ll a1,ll n,ll d){return a1+(n-1)*d;}
int main(){
int n,k;
while(cin>>n>>k){
if(n<=100){
cout<<cal(n,k)<<endl;
continue;
}
ll root=sqrt(n);
// cout<<"root"<<root<<endl;
ll ans1=1ll*k*n;
ll ans2=G(root,k); //
ll ans3=0;
int cnt=root+1; if(k/cnt==0){//防止越界处理
cout<<ans1-G(root,k)<<endl;
continue;
}
while(1){
if(k/root==k/(cnt+1)){
ans3+=(k/(cnt+1))*(cnt+1);
cnt++;
// cout<<k/root<<" "<<k/cnt<<endl;
}
else{
cnt++;
break;
}
}
bool flag=0;
ll lim=k/n; if(lim==0) lim++;
ll val=k/cnt; if(val==0) flag=1;
ll now=cnt;
ll ans4=0;
while(!flag&&val>=lim){
cout<<"NOW "<<now<<endl;
ll LEN = k/val-k/(val+1);
cout<<"LEN "<<LEN<<endl;
cout<<"VAL "<<val<<endl;
ans4+=con(k,val)*(LEN?sum(now,LEN,1):0);
now+=LEN;
val--;
}
cout<<ans1-(ans2-ans3-ans4)<<endl;
}
return 0;
}

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. Hyperledger子项目

    Hyperledger由五个子项目构成: • BlockChain Explorer 展⽰和查询区块链块.事务和相关数据的 Web应⽤ • Fabric 区块链技术的⼀个实现(主要项目) • STL ...

  2. 10.Execution failed with exit status: 3

    错误信息: insert overwrite table t_mobile_mid_use_p_tmp4_rcf select '201411' as month_id, a.prov_id, a.c ...

  3. Luogu 1379 八数码难题

    吐槽:此题就是一点一点卡过去的 警告: 1.千万不能用dfs搜这种东西(dfs需要遍历所有状态才能找到最优解), 分分钟爆炸 2.写结构体的时候要综合判断&的加和不加 Code: // luo ...

  4. unbutu下wireshark编译安装(已更新)

    今天下午在ubuntu下进行编译安装wireshark,过程中出了很多错误,但最终安装成功了,这里写下自己的安装步骤和方法,有参考博文的安装编译方法,也有自己的总结和心得. 1 安装编译工具 $sud ...

  5. C# 关于接口与基类的理解(二者的区别)

    接口(接口的名称一般用大写字母I开头的)是把公共实例(非静态)方法和属性组合起来,以封装特定功能的一个集合.(其实,接口简单理解就是一种约定,使得实现接口的类或结构在形式上保持一致) 注意:使用接口可 ...

  6. sql多表链接之三表连接查询

    表与表之间的关系如下 查询条件:根据员工表的enployee_id 查找他在哪个部门,他在哪个城市工作. 查询语句:

  7. 异步 Action 的定义

    ASP.NET MVC 3中的异步 Action 通过两个匹配的方法XxxAsync/XxxCompleted 来定义,这样的异步 Action 只能定义在继承自 AsyncConoller 的类型中 ...

  8. Oracle Cannot Update TOP N Issue, 请专家解答

    大家好 上周写了匿名方法一文,很多读者,很高兴,相信我们已经从大伙的回复中,对.NET又有了更深刻的认识. 好,现在说主题,各类数据库都有相应更新本表top n的方案.现在我一一举例 首先看表结构如下 ...

  9. ARKit入门

    ARKit介绍 ARKit是iOS11引入的一个全新的框架,使用Visual Inertial Odometry(VIO,视觉惯性里程计)来精确跟踪现实世界中的真实场景.相比其它设备平台,ARKit中 ...

  10. day01.1-Python编译器的安装

    一. 在Windows环境中安装Python编译器     1. 访问Python官网https://www.python.org,下载适用于Windows环境的相关编译器版本: 2. 点击Pytho ...