CF1656D K-good

题意:

给定一个整数 n,请找出一个大于等于 2 的整数 k,使得 n 可以表示成 k 个除以 k 的余数互不相同的数之和。

注意k个除以 k 的余数互不相同的数之和这一句话。容易想到,这就相当于是对 k 的一个完全剩余系求和使得和为 n
因为除以 k 所能得到的余数只能为 0k1,并且,任意一个数减去余数部分,剩下的部分都可以被表示为 xk,其中 x 为整数。
因此,我们设这些余数互不相同的数的和为 pk+k(k1)2=n。有了这个式子,我们不难想到枚举 k并将结果与 n 进行比较,自然,收获TLE
将柿子变形,又有:

k(2p+k1)=2n

其中,2p 为偶数,kk1 各为偶数或奇数,易证, 2n 为偶数,且 k(2p+k1) 各有一个为奇数或偶数,且后者在题目情况中恒大于前者。
因此将 2n 进行分解,把它分解为一个 2 的次幂 a 和一个奇数 b,因此得到这个柿子:

k=min(a,b)

AC代码:

#include<bits/stdc++.h> #define int long long using namespace std; int k,n,t; signed main(){ cin >> t; while(t--){ cin >> n; k = 2; bool flag = 0; int j = 1; n *= 2; while(n % 2 == 0){ j *= 2; n /= 2; } if(n == 1){ cout << "-1\n"; } else{ cout << min(n,j) << "\n"; } } }

__EOF__

本文作者Never Gonna Give You Up!
本文链接https://www.cnblogs.com/CZ-9/p/16498374.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   腾云今天首飞了吗  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示