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 ...
随机推荐
- 基于XC7A100T的PCIe千兆电口以太网收发卡
一.板卡概述 本板卡采用Xilinx公司的Artix7系列的XC7A100T-2FGG484 芯片作为主处理器.包含双路千兆电口网络,双组DDR,PCIeX1 V1.1接口,板卡设计满足工业级要求. ...
- sqli-labs 1-22关
Page-1(Basic Challenges) Less 1-4 Less-(1-4)是最常规的SQL查询,分别采用单引号闭合.无引号.括号单引号闭合.括号双引号闭合,没有过滤:可以采用and '1 ...
- 探秘inter()方法
最近在阅读<深入理解Jav虚拟机>的运行时常量池章节,看到"java语言并不要求常量池一定只有编译器才能产生...运行期间也可以将新的常量放入常量池,这种特性被开发人员利用得比较 ...
- 大数据BI系统是怎么助力企业长久发展的
多元化集团企业在发展到一定阶段后,往往会遇到业务与财务分离.管理缺乏系统决策支持等管理问题.财务决策支持系统建设实施BI是管理升级的内在要求. 1996年,加特纳集团提出了商业智能(Businesin ...
- 思迈特软件Smartbi:机器学习高深难懂?本文深入浅出给你讲明白!
人工智能(Artificial Intelligence,缩写为AI)是对人的意识.思维过程进行模拟的一门新学科.如今,人工智能从虚无缥缈的科学幻想变成了现实.计算机科学家们在人工智能的技术核心--机 ...
- 浅谈MySQL日志文件|手撕MySQL|对线面试官
关注微信公众号[程序员白泽],进入白泽的知识分享星球 前言 上周五面试了字节的第三面,深感数据库知识的重要,我也意识到在平时的学习中,自己对于数据库的学习较为薄弱.甚至在有过一定实习经验之后,依旧因为 ...
- c# 编程学习(二)
标识符是对程序中的各个元素进行标识的名称. 只能使用字母(大写和小写).数字和下划线 标识符必须以字母或下划线开头 变量是容纳值的存储位置.可将变量想象成容纳临时信息的容器 ...
- Collection接口和Map接口的 size 方法和 isEmpty方法
一.Collection接口的 size 方法和 isEmpty方法 int size(); 返回列表中元素的数目,如果这个列表包含超过Integer.MAX_VALUE,则返回Integer.MAX ...
- 反射、静态代理、动态代理(jdk、cglib)
一.反射 反射在之前的文章中详细的解释过了,简单概括就是:可以动态的获取到一个类内部的所有的信息,动态的去创建对象和使用对象以及可以操作对象的属性和方法. 二.代理 首先解释一下代理:使用一个代理对象 ...
- Python:pandas(三)——DataFrame
官方文档:pandas之DataFrame 1.构造函数 用法 pandas.DataFrame( data=None, index=None, columns=None, dtype=None, ) ...