TLE 代码:
#include<bits/stdc++.h>
using namespace std;
bitset<100005> flag;
vector<int> prime;
int l,r;
void isprime()
{
flag[0] = flag[1] = 1;
for(int i(2);i <= 100000;++i)
{
if(!flag[i]) prime.emplace_back(i);
for(int j:prime)
{
if(i*j > 100000) break;
flag[i*j] = 1;
if(!(i%j)) break;
}
}
}
int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);isprime();
while(cin >> l >> r)
{
vector<int> p;
for(int i(l);i <= r;++i)
{
int f(1);
for(int j:prime)
{
if(1ll*j*j > i) break;
if(!(i%j))
{
f = 0;
break;
}
}
if(f && i != 1) p.emplace_back(i);
}
if(p.size() <= 1) cout << "There are no adjacent primes.\n";
else
{
int maxx(0),minn(1e6+1),pmax1,pmax2,pmin1,pmin2;
for(int i(1);i < p.size();++i)
{
if(p[i]-p[i-1] > maxx) maxx = p[i]-p[i-1],pmax1 = p[i-1],pmax2 = p[i];
if(p[i]-p[i-1] < minn) minn = p[i]-p[i-1],pmin1 = p[i-1],pmin2 = p[i];
}
cout << pmin1 << "," << pmin2 << " are closest, " << pmax1 << "," << pmax2 << " are most distant.\n";
}
}
}
AC代码:
#include<bits/stdc++.h>
using namespace std;
bitset<100005> flag;
vector<int> prime;
long long l,r;
void isprime()
{
flag[0] = flag[1] = 1;
for(int i(2);i <= 100000;++i)
{
if(!flag[i]) prime.emplace_back(i);
for(int j:prime)
{
if(i*j > 100000) break;
flag[i*j] = 1;
if(!(i%j)) break;
}
}
}
int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);isprime();
while(cin >> l >> r)
{
vector<int> p;
for(long long i(l);i <= r;++i)
{
int f(1);
for(int j:prime)
{
if(1ll*j*j > i) break;
if(!(i%j))
{
f = 0;
break;
}
}
if(f && i != 1) p.emplace_back(i);
}
if(p.size() <= 1) cout << "There are no adjacent primes.\n";
else
{
int maxx(0),minn(1e6+1),pmax1,pmax2,pmin1,pmin2;
for(int i(1);i < p.size();++i)
{
if(p[i]-p[i-1] > maxx) maxx = p[i]-p[i-1],pmax1 = p[i-1],pmax2 = p[i];
if(p[i]-p[i-1] < minn) minn = p[i]-p[i-1],pmin1 = p[i-1],pmin2 = p[i];
}
cout << pmin1 << "," << pmin2 << " are closest, " << pmax1 << "," << pmax2 << " are most distant.\n";
}
}
}
为什么将 l , r, 和遍历区间的 i 改为 long long 变量能让 TLE -> AC,r 的范围也没爆 long long 吧(?