UVA10025 The ? 1 ? 2 ? ... ? n = k problem

本文讨论了如何通过遍历求和并检查差值的性质,找到满足特定数学条件的最小整数。详细解释了求和公式、奇偶性判断及验证唯一性的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这道题刚开始抓破头脑也想不出怎么做。后来从0到10写了一遍就发现了一些规律。

当且仅当n满足如下情况才是我们要求的n:

(1):sum=1+2+3+.....+n>=k

(2):(sum-k)%2==0(即sum与k的差为偶数。)

(3):对于任何m<n,m不同时满足上面两条。(即保证n是最小的那个数)

第一条很显然,第二条略加证明如下:

因为sum>k,所以一定有sum-x=k,

即1+2+3+......+n-x=k,

1+2+3++...-x/2+...+n-x/2=k,

因为x/2一定是整数,所以x一定是偶数。

就拿12举个例子:

1+2+3+4+5+6+7=28; 28-12=16(16是偶数)

即1+2+3+4+5+6+7-16=1+2+3+4+5+6+7-8-8=2+3+4+5+6-8=12

 得 -1+2+3+4+5+6-7=12

(因为如果一个数变为负的话,相当于和减去二倍的那个数)

作者才疏学浅,证明不甚严谨,如有疏漏,还望不吝指教。

#include<stdio.h>
#include<math.h> 
#include<stdlib.h>

int main(){
  long long k,sum;
  int t,i;
  scanf("%d",&t);
  while(t--){
        sum=0;
        scanf("%lld",&k);
        k=labs(k);
        for(i=1;;i++){
            sum=sum+i;
            if(sum>=k)
                 if((sum-k)%2==0)
                 break;
            }
        
        
        printf(t>0?"%d\n\n":"%d\n",i);           
  }   
  return 0;}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值