Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
Re:超水!! 0MS就ok 代码共享In Reply To:Re:超水!! 0MS就ok 代码共享 Posted by:348854308 at 2010-02-19 21:09:41 假设: n为序列的个数, 2<=n; i为序列开始那个数, 1<=i; 那么sumup=(2*i+n-1)*n/2 ; {ps:等差数列求和公式 s=(首项+末项)*个数/2,这里首项=i,末项=i+n-1,项数=n} 再令已知和为x,列方程: (2*i+n-1)*n/2 = x; 变形-> 2*i*n+n*n-n = 2*x ---> i=(2*x-n*n+n)/2*n {注意这里,i=(2*x/n-n+1)/2,这个就是那个a1} 因为 i>=1>0, 所以 (2*x-n*n+n)>0 变形-> 2*x+1/4>n*n-n+1/4 ---> sqrt(2*x+1/4)>n-1/2 则有 n<sqrt(2^x+1/4)+1/2 最后得到n的范围 2<=n<=(int)(sqrt(2^x+1/4)+1/2-1e-9); {上面的1e-9是修正系数,有必要的} 因为x<2^31, 所以 n<2^16, 这个值为65536, 所以才有那个70000 我们就可以枚举n的值,如果(2*x-n*n+n)被2*n整除话... 然后就墨有然后了. Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator