EOJ----连续正整数之和
来源:互联网 发布:php mvc项目 编辑:程序博客网 时间:2024/05/16 10:20
我们可以知到从i开始连续k个数之和的计算公式如下:
sum = k * (2 * i + k - 1) / 2;
在题目要求sum == num 的所有可能情况,上面的解法是从起始位置开始循环,又根据连续个数循环,这样需要两重循环。但如果我们根据上面的公式逆向想想,如果sum==num时,i与k的关系等式为k * (2 * i + k - 1) = 2 * num。因此,如果用k循环,计算出起始位置 i = ( 2*n / k - k + 1) / 2,岂不是时间复杂度降到线性的了
连续正整数之和
Time limit per test: 1.0 seconds
Time limit all tests: 1.0 seconds
Memory limit: 256 megabytes
有些正整数可以表示为
给定一个正整数
Input
第 1 行:一个整数
第 2 至
Output
对每个测试数据,输出 Case x: y
。x 为从 1 开始的测试数据编号,y 为符合条件的解的组数。
Examples
Input
3151699
Output
Case 1: 3Case 2: 0Case 3: 5
#include<cstdio>#include<algorithm>#include<iostream>#include<cmath>using namespace std;int main(){ int num,temp,ans; int t,cas=1; scanf("%d",&t); while(t--) { scanf("%d",&num); ans=0; if(num==3)//3要特殊处理下, { printf("Case %d: 1\n",cas++); continue; } for(int k=1; k<=sqrt(2*num) or k<sqrt(2*num); k++)//通过公式知道k不会超过sqrt(2*num),具体我也懒得去写了大概就是sqrt(2*num)了 { if(2*num % k == 0)//由公式k * (2 * i + k - 1) = 2 * num 知道2 * num能够被k整除时成立才可能 { temp = 2*num/k-k+1; //temp就是公式中的2*i,因为2*i=2*num/k-k+1;当然temp/2也就是符合条件的第一个数了 if(temp>0&&temp%2==0&&temp/2!=0) { ans++; } } } printf("Case %d: %d\n",cas++,ans-1); } return 0;}
阅读全文
0 0
- EOJ----连续正整数之和
- EOJ 3025 连续正整数之和
- EOJ 3276 连续正整数之和(模拟)
- 连续正整数之和
- 连续正整数之和
- 连续正整数之和
- 拆分为连续正整数之和
- 正整数分解为几个连续自然数之和
- 一个整数分解为连续正整数之和
- 正整数分解为几个连续自然数之和
- 正整数分解为几个连续自然数之和
- 正整数分解为几个连续自然数之和
- 【基本算法】拆分为连续正整数之和
- 一个正整数分解为几个连续的正整数之和
- 连续正整数之和为1000 的共有几组?
- 实现连续正整数之和为某个特定值【算法】
- 经典题:一个整数分解为连续正整数之和
- 把输入整数拆分为连续的正整数之和
- java 合并两个有序单链表
- [论文学习]Convolutional matrix factorization for document context-aware recommendation
- WebBench源码剖析(上)
- MFC中的DC,CDC和HDC
- HDU 3001 Travelling
- EOJ----连续正整数之和
- 技术实操|Apache Spark 内存管理详解(上篇)
- java 堆 栈 方法区的简单分析
- Swift 枚举关联值
- IBM x3650 M4服务器,电源断电后,来电自动开机
- Hadoop基础教程-第5章 YARN:资源调度平台(5.4 YARN集群运行)(草稿)
- 重要开发网站-持续更新
- M_CYOUSA
- 内存管理