K-good number Theory + 数学问题
这道题是我做CodeTon Round1时的D题,总的来看思路很重要,有几个比较明显的切入问题的角度,要选择到最优的那个;
先看题目:

我们可以发现,这道题的描述一目了然,就是说我们能不能找k个数的和正好等于我们输入的n;
但是有对于这k个数的限制:
·k>=2
`k[i]%k 不相同
所以我们粗略的想想就可以想到,既然这k个数的关于k的余数都不相同,且为k个正数,所以我们就可以这么想这k个数是在1,2,3……,k的基础上进行的修改(+k || +2k || +3k……),所以我们就可以得到这样一个一定正确的式子:
我们先令dp[i]为i的高斯求和,k是我们最后的ans:
if ( (n - dp[k]) % k == 0 ) ans = k;
解释一下:因为n能和这个高斯和的差能被k整除得到x,说明我只要对于1~k中的任意x个数加上一个k或者对一个数加上xk都能得到这k个数;
单看这个分析是正确的,但是这道题不能这样去做是因为n的数据范围太大了!!!如果我要得到这么dp[k]去match 10^18这个数量级的话,根据高斯求和,我起码要开10^9这么大的数组,而且还得从前往后遍历,这很明显是不正确的;
所以我们对于一个数据很大的问题我们肯定是能找到某种规律是他们普遍适用的,或者说我们能逐渐将数据缩小到一个我们可以接受的范围,而且这个缩小数据的过程也一定不能是一个一个往下缩,一般采取log级别的缩减;这是解决这种问题的总体思路;
所以我会自然而然地想到我们分成奇数和偶数,然后就可以发现,当n为奇数时,一定可以取k = 2,因为3k + 2是k取2时所能涵盖的所有数,即除了1之外的奇数;那么奇数问题解决了,我们就会去想解决偶数问题 , 但是我很难对这些偶数进行分类,只能根据样例1猜测是不是所有的2的指数幂的数都只能输出-1;
虽然上面的两个思路都没有完整的求解出我们所要的答案,但是他对于找出正确答案是有借鉴作用的,我们先去看到之前我们得出的那个充分必要条件,并将其中的dp用高斯求和展开可得 ( n - (1+k)*k/2 ) 是k的整数倍即可,然后我们可以根据数学轻松得出n和(1+k)*k/2 是k的整数倍就行了呗,由后面那个式子可以得出k只有为奇数时,后面那个才能是k的整数倍;
然后我们再将目光聚焦到前面的n上,当n为奇数时不用想肯定是可以取2的(前面的借鉴作用),所以当n为偶数时,如果他能被k整除,就是对的,说明n不能是2的指数幂,再次证明了我们刚刚的猜想是正确的;所以我们做以下操作:
当n能被2整除时,就除以2直到n变成奇数,也就是我们这里要的k就行了;
但是问题真正解决了吗? 如果当前的dp[k] > n本身呢?说明我们k取大了对吧,然后我们刚刚的操作相当于把n拆成了奇数k和2的指数幂x,那我们就想取x,又会发现后半部分除以x后变成(1+x)/ 2,因为x为偶数,所以这样是不行的,所以我们就想这个2这么碍眼,如果我干脆取2x,会得到(k - 1 - 2x ) / 2,我们要证明这个能整除且为非负数,因为k为奇数,1+2x为奇数,所以奇数减奇数肯定是偶数,所以一定成立,但是k一定要大于等于2x+1,就一定满足题干,所以我们发现2x < k时,dp[k] > n ,2x >k时,dp[k]一定刚好满足条件;
所以对于k>1时,我们就取最后的ans = min(k,2x);
总结:这道题很多主要是数学思想上的,很多地方需要用到猜想的方法,然后对于应付大数据的数我们就要这样类似的处理,然后我们可能一开始得不出正确答案,但是通过调整之后一定能够得出我们所要的ans;
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int main()
{
int t;
cin >> t;
while(t--){
LL n;
cin >> n;
LL k = 1;
while(n%2 == 0){
n/=2;
k*=2;
}
if(n == 1) cout << -1 <<'\n';
else cout << min(n,2*k) << '\n';
}
return 0;
}
K-good number Theory + 数学问题的更多相关文章
- 2016级算法第二次上机-F.ModricWang's Number Theory II
891 ModricWang's Number Theory II 思路 使得序列的最大公约数不为1,就是大于等于2,就是找到一个大于等于2的数,它能够整除序列中的所有数. 考虑使得一个数d整除数组中 ...
- Number Theory Problem(The 2016 ACM-ICPC Asia China-Final Contest 找规律)
题目: Mr. Panda is one of the top specialists on number theory all over the world. Now Mr. Panda is in ...
- 【BZOJ4026】dC Loves Number Theory 分解质因数+主席树
[BZOJ4026]dC Loves Number Theory Description dC 在秒了BZOJ 上所有的数论题后,感觉萌萌哒,想出了这么一道水题,来拯救日益枯竭的水题资源. 给 ...
- BZOJ_4026_dC Loves Number Theory _主席树+欧拉函数
BZOJ_4026_dC Loves Number Theory _主席树+欧拉函数 Description dC 在秒了BZOJ 上所有的数论题后,感觉萌萌哒,想出了这么一道水题,来拯救日益枯 竭 ...
- [E. Ehab's REAL Number Theory Problem](https://codeforces.com/contest/1325/problem/E) 数论+图论 求最小环
E. Ehab's REAL Number Theory Problem 数论+图论 求最小环 题目大意: 给你一个n大小的数列,数列里的每一个元素满足以下要求: 数据范围是:\(1<=a_i& ...
- 题解-Ehab's REAL Number Theory Problem
Ehab's REAL Number Theory Problem 前置知识 质数 分解质因数 无向无权图最小环<讲> Ehab's REAL Number Theory Problem/ ...
- 计蒜客 31452 - Supreme Number - [简单数学][2018ICPC沈阳网络预赛K题]
题目链接:https://nanti.jisuanke.com/t/31452 A prime number (or a prime) is a natural number greater than ...
- BZOJ 4026: dC Loves Number Theory 可持久化线段树 + 欧拉函数 + 数学
Code: #include <bits/stdc++.h> #define ll long long #define maxn 50207 #define setIO(s) freope ...
- HDU 1018-Big Number(数学)
Big Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...
随机推荐
- Note -「Lagrange 插值」学习笔记
目录 问题引入 思考 Lagrange 插值法 插值过程 代码实现 实际应用 「洛谷 P4781」「模板」拉格朗日插值 「洛谷 P4463」calc 题意简述 数据规模 Solution Step 1 ...
- linux 运维工程师如何降低工作难度
文章目录 1.Linux "优化" 2.git "优化" 3.mysql "优化" 4.kubernetes "优化" ...
- Zookeeper 提供的API
上篇介绍了Zookeeper命令行相关的知识,本小作文介绍从另一个维度操作Node相关的内容:Zookeer的API.同样借用Zookeeper应用之一的数据注册与订阅中的案例类比命令行操作,重点介绍 ...
- k8s-cka考试题库
本次测试的所有问题都必须在指定的cluster配置环境中完成.为尽量减少切换,系统已对问题进行分组,同一cluster内的所有问题将连续显示. 开启TAB补全 做题前先配置k8s自动补齐功能,否则无法 ...
- 轩辕展览-VR虚拟展厅设计的好处和优势是什么?
yu情仍在继续,实体展厅很糟糕,在过去两年之中,越来越多的实体展厅因闲置而关闭,线上VR虚拟展厅设计逐渐走出圈子,凭借云展示的优势和国家政策的支持,登上展示和销售的旗帜. 产品线上展厅的优势是什么1. ...
- Dashboard究竟是什么,它在数据展示上的优势何在?
相信很多人在做数据分析工作的时候都遇到这种情况,辛辛苦苦做出来的数据报表老板看了嫌弃不够直观.生动,客户看了嫌弃不够高大上.这个时候不妨尝试一下使用Dashboard来展示报表数据,可能有些人对Da ...
- java变量的初始化之后的默认值
对于类的成员变量 不管程序有没有显示的初始化,Java 虚拟机都会先自动给它初始化为默认值. 1.整数类型(byte.short.int.long)的基本类型变量的默认值为0. 2.单精度浮点型(f ...
- 小白文-SpringMVC-解读DispatcherServlet源码
SpringMVC 学习完Spring框架技术之后,差不多会出现两批人: 一批是听得云里雾里,依然不明白这个东西是干嘛的: 还有一批就是差不多理解了核心思想,但是不知道这些东西该如何去发挥它的作用. ...
- 进程&线程(一)——multiprocessing,threading
本节内容为①进程线程的基础知识:②在Python的实现方法: 学习总结自: 一文看懂Python多进程与多线程编程(工作学习面试必读) - 知乎 multiprocessing 官方文档 1.进程线程 ...
- TypeError
1.only size-1 arrays can be converted to Python scalars 问题来源:需要把一个float数组A转为int,于是直接在代码中写了 B=int(A), ...