紫书 习题 10-13 UVa 11526(打表找规律+分步枚举)
首先看这道题目,我预感商数肯定是有规律的排列的,于是我打表找一下规律
100 / 1 = 100
100 / 2 = 50
100 / 3 = 33
100 / 4 = 25
100 / 5 = 20
100 / 6 = 16
100 / 7 = 14
100 / 8 = 12
100 / 9 = 11
100 / 10 = 10
100 / 11 = 9
100 / 12 = 8
100 / 13 = 7
100 / 14 = 7
100 / 15 = 6
100 / 16 = 6
100 / 17 = 5
100 / 18 = 5
100 / 19 = 5
100 / 20 = 5
100 / 21 = 4
100 / 22 = 4
100 / 23 = 4
100 / 24 = 4
100 / 25 = 4
100 / 26 = 3
100 / 27 = 3
100 / 28 = 3
100 / 29 = 3
100 / 30 = 3
100 / 31 = 3
100 / 32 = 3
100 / 33 = 3
100 / 34 = 2
100 / 35 = 2
100 / 36 = 2
100 / 37 = 2
100 / 38 = 2
100 / 39 = 2
100 / 40 = 2
100 / 41 = 2
100 / 42 = 2
100 / 43 = 2
100 / 44 = 2
100 / 45 = 2
100 / 46 = 2
100 / 47 = 2
100 / 48 = 2
100 / 49 = 2
100 / 50 = 2
100 / 51 = 1
100 / 52 = 1
100 / 53 = 1
100 / 54 = 1
100 / 55 = 1
100 / 56 = 1
100 / 57 = 1
100 / 58 = 1
100 / 59 = 1
100 / 60 = 1
100 / 61 = 1
100 / 62 = 1
100 / 63 = 1
100 / 64 = 1
100 / 65 = 1
100 / 66 = 1
100 / 67 = 1
100 / 68 = 1
100 / 69 = 1
100 / 70 = 1
100 / 71 = 1
100 / 72 = 1
100 / 73 = 1
100 / 74 = 1
100 / 75 = 1
100 / 76 = 1
100 / 77 = 1
100 / 78 = 1
100 / 79 = 1
100 / 80 = 1
100 / 81 = 1
100 / 82 = 1
100 / 83 = 1
100 / 84 = 1
100 / 85 = 1
100 / 86 = 1
100 / 87 = 1
100 / 88 = 1
100 / 89 = 1
100 / 90 = 1
100 / 91 = 1
100 / 92 = 1
100 / 93 = 1
100 / 94 = 1
100 / 95 = 1
100 / 96 = 1
100 / 97 = 1
100 / 98 = 1
100 / 99 = 1
100 / 100 = 1
大家发现了什么?我发现很多商数都是大块大块地集中在一起的,而且集中的部分在除数大概为根号n到n之间(多打几个数就会发现)
也就是说这个部分的数字其实可以用一些比较巧妙的部分枚举出来。
所以我就有了一个想法,就这个数据而言,我们可以分两步枚举,第一步是枚举除数1~10,第二步是枚举商1~9来计算,复杂度是根号n
n最大为2的31次方-1, 根号之后是不会超时的
那么第一步直接就暴力就好了,关键是第二步怎么做
通过观察可以 ,发现100 / 1 = 100, 100 / 2 = 50, 100 / 3 = 33
然后在表中除数在100~51商是1,在50~34商是2……
所以我们可以算出“断点”,把除数分成一段一段的,每一段的商数是一样的。
所以我们可以统计每一段的长度,然后乘以商数更新答案
思路大致就是这样
还有一些细节需要注意
(1)枚举的边界问题
如这个数是完全平方数,那么可以除数从1到根号n,商数从1到(根号n) -1
如果不是的话,那么除数是1到根号n,商数也是1到根号n
举个例子可以发现,例如99这个数
根号99为9,在9(根号99)附近时这样的
99 / 9 = 11
99 / 10 = 9
所以如果不是完全平方数的话,两边都要枚举到根号n
(2)当n <= 0 时,要特判,直接输出0
因为按照题目那个程序的话n<=0时循环压根就不会进行,答案不会更新
(3)最后一个断点是根号n
例如
99 / 9 = 11
99 /10 = 9
99 / 11 = 9
99 / 12 = 8
最后一个数9的断点99 / 9 = 11是倒数第二个断点, 而除数到9就到了第一步枚举去了,
所以最后一个断点是9, 最后一段长度为 11 - 9 = 2
代码
#include<cstdio>
#include<cmath>
#include<vector>
#define REP(i, a, b) for(int i = (a); i < (b); i++) //注意是左闭右开
using namespace std;
typedef long long ll;
long long h(int n)
{
ll ans = 0;
int m = sqrt(n + 0.5);
REP(i, 1, m + 1) //第一步枚举除数,直接暴力
ans += n / i;
vector<int> g;
int t; //枚举边界问题
if(n % m == 0) t = m;
else t = m + 1;
REP(i, 1, m + 1) g.push_back(n / i); //加入“断点”
REP(i, 0, g.size() - 1)
ans += (i + 1) * (g[i] - g[i+1]); //商乘上每一段的长度
ans += g.size() * (g[g.size() - 1] - m); //最后一个断点是根号n
return ans;
}
int main()
{
int n, T;
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
if(n <= 0) { puts("0"); continue; } //特判
printf("%lld\n", h(n));
}
return 0;
}
紫书 习题 10-13 UVa 11526(打表找规律+分步枚举)的更多相关文章
- 紫书 习题 11-9 UVa 12549 (二分图最小点覆盖)
用到了二分图的一些性质, 最大匹配数=最小点覆盖 貌似在白书上有讲 还不是很懂, 自己看着别人的博客用网络流写了一遍 反正以后学白书应该会系统学二分图的,紫书上没讲深. 目前就这样吧. #includ ...
- 紫书 习题 11-8 UVa 1663 (最大流求二分图最大基数匹配)
很奇怪, 看到网上用的都是匈牙利算法求最大基数匹配 紫书上压根没讲这个算法, 而是用最大流求的. 难道是因为第一个人用匈牙利算法然后其他所有的博客都是看这个博客的吗? 很有可能-- 回归正题. 题目中 ...
- 紫书 习题8-12 UVa 1153(贪心)
本来以为这道题是考不相交区间, 结果还专门复习了一遍前面写的, 然后发现这道题的区间是不是 固定的, 是在一个范围内"滑动的", 只要右端点不超过截止时间就ok. 然后我就先考虑有 ...
- 紫书 习题8-7 UVa 11925(构造法, 不需逆向)
这道题的意思紫书上是错误的-- 难怪一开始我非常奇怪为什么第二个样例输出的是2, 按照紫书上的意思应该是22 然后就不管了,先写, 然后就WA了. 然后看了https://blog.csdn.net/ ...
- 紫书 习题 10-11 UVa 1646(斐波那契+高精度)
自己用手算一下可以发现是斐波那契数列,然后因为数字很大,用高精度 以后做题的时候记得算几个数据找规律 #include<cstdio> #include<cmath> #inc ...
- 紫书 习题 11-10 UVa 12264 (二分答案+最大流)
书上写的是UVa 12011, 实际上是 12264 参考了https://blog.csdn.net/xl2015190026/article/details/51902823 这道题就是求出一种最 ...
- 紫书 习题7-13 UVa 817(dfs+栈求表达式的值)
题目链接 点击打开链接 这道题分为两个部分, 一用搜索枚举每种可能, 二计算表达式的值, 有挺多细节需要注意 特别注意我的代码中在计算表达式的值中用到了一个!(代码枚举中的!表示不加符号, 我现在说 ...
- 紫书 习题7-8 UVa 12107 (IDA*)
参考了这哥们的博客 https://blog.csdn.net/hyqsblog/article/details/46980287 (1)atoi可以char数组转int, 头文件 cstdlib ...
- 紫书 习题 11-7 UVa 10801 (单源最短路变形)
把每个电梯口看作一个节点, 然后计算边的权值的时候处理一下, 就ok了. #include<cstdio> #include<vector> #include<queue ...
随机推荐
- 滚动监听 after选择器
一.如何实现滚动到一定位置将内容固定在页面顶部 window.onscroll=function(){ //滚动的距离,距离顶部的距离 var topScroll =document.body.scr ...
- 关于github里readme编辑的方法
实验室的老师昨天改完论文发我后,说按照例子改.于是才发现github里readme编辑满满的极客思维. 看了一下csdn给的教程 https://blog.csdn.net/Kaitiren/arti ...
- STM8S103 STVD编译空间不足
关于text空间(理解为代码空间)不足问题 # 关于.bsct和.ubsct问题(着重参考http://www.waveshare.net/article/STM8-3-1-10.htm) map文件 ...
- SGU 180 Inversions【树状数组】
题意:求逆序数 和POJ那题求逆序数的一样,不过这题离散化之后,要去一下重,然后要开到long long #include<iostream> #include<cstdio> ...
- Session与Token认证机制 前后端分离下如何登录
字号 1 Web登录涉及到知识点 1.1 HTTP无状态性 HTTP是无状态的,一次请求结束,连接断开,下次服务器再收到请求,它就不知道这个请求是哪个用户发过来的.当然它知道是哪个客户端地址发过来的 ...
- POJ-3348 Cows 计算几何 求凸包 求多边形面积
题目链接:https://cn.vjudge.net/problem/POJ-3348 题意 啊模版题啊 求凸包的面积,除50即可 思路 求凸包的面积,除50即可 提交过程 AC 代码 #includ ...
- POJ-1113 Wall 计算几何 求凸包
题目链接:https://cn.vjudge.net/problem/POJ-1113 题意 给一些点,求一个能够包围所有点且每个点到边界的距离不下于L的周长最小图形的周长 思路 求得凸包的周长,再加 ...
- [原创]关于javax.servlet.ServletException: File [/loginController/getVerifCode.jsp] not found异常 解决方案
如果前台可以访问 后台并且有数据进行响应,那么一下方案也许可以帮到你... 修改前: 出现异常 javax.servlet.ServletException: File [/loginControll ...
- 题解 P3413 【SAC#1 - 萌数】
这道题刚开始正向思维,然后处理重复的时候咕咕了. 参考了@巨型方块 大佬的题解后AC了,在这里就说几个我觉得比较重要或是容易被忽略的点,然后补充一些跳过的证明. 这道题的状态可以设为$dp[i][j] ...
- POJ 1741 Tree 树的分治(点分治)
题目大意:给出一颗无根树和每条边的权值,求出树上两个点之间距离<=k的点的对数. 思路:树的点分治.利用递归和求树的重心来解决这类问题.由于满足题意的点对一共仅仅有两种: 1.在以该节点的子树中 ...