关于数组偏移
查看原帖
关于数组偏移
379113
dtrthg楼主2024/7/30 18:14

其他不变,标记素数用的数组flag 用map写(即不偏移)就可以,将flag往左偏移l位就不行,为什么qwq

不偏移代码:

#include <bits/stdc++.h>
using namespace std;
#define fo(i,a,b) for(ll i=a;i<=b;++i)
#define of(i,a,b) for(ll i=a;i>=b;--i)
#define ll long long
const int inf=0x3f3f3f3f;
const ll INF=9e18;
const int Maxn=1e6+10;
ll prime[Maxn],pos_p=0;
map <int,bool> flag;
ll p[Maxn],cnt_p;
ll vis[Maxn];
void get_prime(ll n)
{
	fo(i,2,n)
	{
		if(!vis[i]) vis[i]=prime[++pos_p]=i;
		fo(j,1,pos_p)
		{
			if(vis[i]<prime[j] || prime[j]*i>n) break;
			vis[prime[j]*i]=prime[j];
		}
	}
	return ;
}
void init()
{
	cnt_p=0;
	return ;
}
int main()
{
	ios::sync_with_stdio(0);
	get_prime(50000);
//	cout<<"prime:"; fo(i,1,1000) cout<<prime[i]<<' '; cout<<endl;//
	ll l,r;
	while(cin>>l>>r)
	{
		init();
		fo(i,1,pos_p)
		{
			fo(j,l/prime[i],r/prime[i])
			{
				if(j*prime[i]<l || j*prime[i]>r || j<=1) continue;
				flag[j*prime[i]]=1;
			} 
		}
		fo(i,l,r) if(!flag[i] && i!=1) p[++cnt_p]=i;
//		cout<<"p:"; fo(i,1,cnt_p) cout<<p[i]<<' '; cout<<endl;//
		ll minn=INF,maxx=-INF;
		ll x_min=-1,y_min=-1,x_max=-1,y_max=-1;
		fo(i,2,cnt_p)
		{
			if(p[i]-p[i-1]>maxx) 
			{
				x_max=i-1; y_max=i;
				maxx=p[i]-p[i-1];
			}
			if(p[i]-p[i-1]<minn) 
			{
				x_min=i-1; y_min=i;
				minn=p[i]-p[i-1];
			}
		}
		if(x_min==-1) cout<<"There are no adjacent primes."<<endl;
		else cout<<p[x_min]<<','<<p[y_min]<<" are closest, "<<p[x_max]<<','<<p[y_max]<<" are most distant."<<endl;
	}
	return 0;
}
/*
in1:
1 100
1000000000 1001000000
1000000000 1000000008
2147483587 2147483647
2147481000 2147483646
1 2
2 3

out1:
2,3 are closest, 89,97 are most distant.
1000000007,1000000009 are closest, 1000097621,1000097797 are most distant.
There are no adjacent primes.
2147483629,2147483647 are closest, 2147483587,2147483629 are most distant.
2147481899,2147481901 are closest, 2147481673,2147481793 are most distant.
There are no adjacent primes.
2,3 are closest, 2,3 are most distant.
*/

偏移:

#include <bits/stdc++.h>
using namespace std;
#define fo(i,a,b) for(ll i=a;i<=b;++i)
#define of(i,a,b) for(ll i=a;i>=b;--i)
#define ll long long
const int inf=0x3f3f3f3f;
const ll INF=9e18;
const int Maxn=1e6+10;
ll prime[Maxn],pos_p=0;
bool flag[Maxn];
ll p[Maxn],cnt_p;
ll vis[Maxn];
void get_prime(ll n)
{
	fo(i,2,n)
	{
		if(!vis[i]) vis[i]=prime[++pos_p]=i;
		fo(j,1,pos_p)
		{
			if(vis[i]<prime[j] || prime[j]*i>n) break;
			vis[prime[j]*i]=prime[j];
		}
	}
	return ;
}
void init()
{
	cnt_p=0;
	return ;
}
int main()
{
	ios::sync_with_stdio(0);
	get_prime(50000);
//	cout<<"prime:"; fo(i,1,1000) cout<<prime[i]<<' '; cout<<endl;//
	ll l,r;
	while(cin>>l>>r)
	{
		init();
		fo(i,1,pos_p)
		{
			fo(j,l/prime[i],r/prime[i])
			{
				if(j*prime[i]<l || j*prime[i]>r || j<=1) continue;
				flag[j*prime[i]-l]=1;
			} 
		}
		fo(i,l,r) if(!flag[i-l] && i!=1) p[++cnt_p]=i;
		cout<<"p:"; fo(i,1,cnt_p) cout<<p[i]<<' '; cout<<endl;//
		ll minn=INF,maxx=-INF;
		ll x_min=-1,y_min=-1,x_max=-1,y_max=-1;
		fo(i,2,cnt_p)
		{
			if(p[i]-p[i-1]>maxx) 
			{
				x_max=i-1; y_max=i;
				maxx=p[i]-p[i-1];
			}
			if(p[i]-p[i-1]<minn) 
			{
				x_min=i-1; y_min=i;
				minn=p[i]-p[i-1];
			}
		}
		if(x_min==-1) cout<<"There are no adjacent primes."<<endl;
		else cout<<p[x_min]<<','<<p[y_min]<<" are closest, "<<p[x_max]<<','<<p[y_max]<<" are most distant."<<endl;
	}
	return 0;
}
/*
in1:
1 100
1000000000 1001000000
1000000000 1000000008
2147483587 2147483647
2147481000 2147483646
1 2
2 3

out1:
2,3 are closest, 89,97 are most distant.
1000000007,1000000009 are closest, 1000097621,1000097797 are most distant.
There are no adjacent primes.
2147483629,2147483647 are closest, 2147483587,2147483629 are most distant.
2147481899,2147481901 are closest, 2147481673,2147481793 are most distant.
There are no adjacent primes.
2,3 are closest, 2,3 are most distant.
*/
2024/7/30 18:14
加载中...