http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4775
看yh大佬的课件的时候看到这题找规律的题,于是我就做了一下。原本我还想在函数开头先加1,结果没发现加1以后就溢出了,所以wa了一次,改过来就好。
题意简单,主要是要打表出来,发现一个规律,n^2-1和n^2的布尔值是不同的,所以只要一个等差数列求和就可以分别求出0到a-1和0到b的值了。
View Code
1 #include <cstdio> 2 #include <cstdlib> 3 #include <cmath> 4 #include <cstring> 5 6 typedef long long ll; 7 const double eps = 1e-6; 8 9 ll deal(ll n){ 10 if (n == -1) return 0; 11 ll r = (ll)sqrt((double) n + 1 + eps); 12 if (r & 1){ 13 r = (r + 1) >> 1; 14 return ((r << 1) - 1) * r; 15 } 16 else{ 17 return n - r * r + (r >> 1) * (r - 1) + 1; 18 } 19 } 20 21 int main(){ 22 ll n, m; 23 24 while (~scanf("%lld%lld", &n, &m)){ 25 printf("%lld\n", deal(m) - deal(n - 1)); 26 } 27 28 return 0; 29 }
十分简短,算是十分基础的规律题了!
——written by Lyon