之前的题目:最大也就到2e5左右。1e9的数据范围就意味着,即使是O(n)的复杂度,也会超时。此时可以考虑使用数学方法进行解题。
❗打表:利用电脑去找一些合法答案,然后在这些合法答案中找规律。
⭐打表后找到的规律:
(1)好像所有的奇数都是合法的X,都可以用平方差表示。
(2)偶数中,只有4的倍数能够用平方差表示。
打表代码:
//打表找规律
void test(){
map<int,int>st;
for(int i = 1; i <= 100; i ++){
for(int j = 0; j <= 100; j ++){
for(int k = 0; k <= 100; k ++){
if(i == (j * j - k * k)){
//if(i % 2)continue;
if(!st[i])
cout << i << endl;
st[i] = true;
}
}
}
}
}
#include <iostream>
#include<bits/stdc++.h>
#define int long long
#define INF 0x3f3f3f3f
using namespace std;
void solve(){
int l,r;
cin>>l>>r;
//1-R之间
int sr=(r+1)/2+r/4;//奇数个数+4的倍数
//1-L之间
int sl=(l-1+1)/2+(l-1)/4;
//L-R之间
cout<<sr-sl<<endl;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t;
t=1;
//cin>>t;
while(t--)
solve();
}