1138 連續整數的和
基準時間限制:1 秒 空間限制:131072 kb 分值: 10 難度:2級演算法題 收藏 關注
給出乙個正整數n,將n寫為若干個連續數字和的形式(長度 >= 2)。例如n = 15,可以寫為1 + 2 + 3 + 4 + 5,也可以寫為4 + 5 + 6,或7 + 8。如果不能寫為若干個連續整數的和,則輸出no solution。
input
輸入1個數n(3
<= n
<= 10^9)。
output
輸出連續整數中的第1個數,如果有多個按照遞增序排列,如果不能分解為若干個連續整數的和,則輸出no solution。
input示例
15output示例14
7
根據等差數列s=(a1+(n-1)*d)*n/2和an=a1+(n-1)*d
可以算出s所能取的連續長度最大為sqrt(2
*n+1/4)
即該題的範圍可以縮小到[2,sqrt(2
*n+1/4)]大概。
根據這區間,再配合s=(2
*a1+(i-1))*i/2(i為連續整數長度)即可算出符合的連續整數和符合條件的個數了。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define mod 1000000007
#define fir first
#define sec second
#define fin freopen("/home/ostreambaba/文件/input.txt", "r", stdin)
#define fout freopen("/home/ostreambaba/文件/output.txt", "w", stdout)
#define mes(x, m) memset(x, m, sizeof(x))
#define pii pair
#define pll pair
#define inf 1e9+7
#define inf 0x3f3f3f3f
#define pi 4.0*atan(1.0)
#define lowbit(x) (x&(-x))
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
typedef
long
long ll;
typedef
unsigned
long
long ull;
const
double eps = 1e-9;
const
int maxn = 1e5;
using
namespace
std;
inline
int read()
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*f;
}int a[maxn+5];
int main()
}if(!flag)
return
0;}
51nod 1138 連續整數的和
給出乙個正整數n,將n寫為若干個連續數字和的形式 長度 2 例如n 15,可以寫為1 2 3 4 5,也可以寫為4 5 6,或7 8。如果不能寫為若干個連續整數的和,則輸出no solution。input 輸入1個數n 3 n 10 9 output 輸出連續整數中的第1個數,如果有多個按照遞增序...
51Nod 1138 連續整數的和
給出乙個正整數n 3 n 10 9 將n寫為若干個連續數字和的形式 長度 2 例如n 15,可以寫為1 2 3 4 5,也可以寫為4 5 6,或7 8。如果不能寫為若干個連續整數的和,則輸出no solution。假設n a a k 那麼n a k k k 1 2 a和k都是未知,假如我們遍歷a,k...
51nod 1138 連續整數的和
萌新第一次發文 進入正題啦.此題最容易想到的就是利用等差數列的通項公式sum n a1 an 2 n a1 a1 n 1 2,此時公差d為1。將次方程做一些變換,a1 sum 1 2 n 2 n n,從n 2開始遍歷,所找到的a1即為解。這裡的難點是遍歷n的範圍,因為a1 1,所以a1 ai n 1...