今天真难!!!
记住线性筛的模板,下面第一题就是了
知否知否,应是绿肥红瘦
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e7+1;
int prime[N];
int b[N];
int cnt=0,maxn=1e7;
void iint()
{
memset(b,1,sizeof(b));
b[0]=b[1]=0;
for(int i=2;i<=maxn;i++)
{
if(b[i])
prime[++cnt]=i;
for(int j=1;j<=cnt&&prime[j]*i<=maxn;j++)
{
b[prime[j]*i]=0;
if(i%prime[j]==0) break;
}
}
}
int su(ll n)
{
int flag=0;
for(int i=1;prime[i]<=sqrt(n*1.0);i++)
if(n%prime[i]==0)
{
flag=1;
break;
}
if(n==1) flag=1;
return flag;
}
int main()
{
int n;
ll x,y,z;
iint();
cin>>n;
while(n--)
{
cin>>x>>y>>z;
if(su(x+y-z)==0) cout<<"yes"<<endl;
else cout<<"no"<<endl;
}
return 0;
}
高木同学的因子
原来就做过,不需要素数筛
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b)
{
return b==0?a:gcd(b,a%b);
}
ll x,y,z;
int main()
{
cin>>x>>y;
z=gcd(x,y);
ll ans=0;
for(ll i=1;i<=sqrt(z);i++)
{
if(z%i==0)
ans+=2;
if(i==sqrt(z))
{
ans--;
break;
}
}
cout<<ans<<endl;
return 0;
}
最大素因子
素数筛之后,再把筛出来的素数数组下标与元素反过来放在另一个数组里,
以此来标记是第几个素数
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e4+1;
int prime[N],primei[N];
int b[N];
int cnt=0,maxn=1e4;
void iint()
{
memset(b,1,sizeof(b));
b[0]=b[1]=0;
for(int i=2;i<=maxn;i++)
{
if(b[i])
prime[++cnt]=i;
for(int j=1;j<=cnt&&prime[j]*i<=maxn;j++)
{
b[prime[j]*i]=0;
if(i%prime[j]==0) break;
}
}
}
void lpf()
{
for(int i=1;i<=cnt;i++)
{
primei[prime[i]]=i;
}
}
int su(ll n)
{
int flag=0;
for(int i=1;prime[i]<=sqrt(n*1.0);i++)
if(n%prime[i]==0)
{
flag=1;
break;
}
if(n==1) flag=1;
return flag;
}
int main()
{
iint();
lpf();
ll n,i;
while(cin>>n)
{
for(i=n;i>=1;i--)
{
if(i==1)
{
printf("0\n");
break;
}
if(n%i==0&&su(i)==0)
{
printf("%d\n",primei[i]);
break;
}
}
}
return 0;
}
素数线性筛
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e7+1;
int prime[N];
int b[N];
int cnt=0,maxn=1e7;
void iint()
{
memset(b,1,sizeof(b));
b[0]=b[1]=0;
for(int i=2;i<=maxn;i++)
{
if(b[i])
prime[++cnt]=i;
for(int j=1;j<=cnt&&prime[j]*i<=maxn;j++)
{
b[prime[j]*i]=0;
if(i%prime[j]==0) break;
}
}
}
int main()
{
iint();
ll n,k,q;
cin>>n>>q;
while(q--)
{
cin>>k;
cout<<prime[k]<<endl;
}
return 0;
}
函数版素数判定
定义b数组是要定义成bool
因为memset只能对0,-1赋值,对1赋值的话是一个正数,因此要写成bool,是正数就变为1,以此来对素数进行标记
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e7+1;
int prime[N];
bool b[N];
int cnt=0,maxn=1e7;
void iint()
{
memset(b,1,sizeof(b));
b[0]=b[1]=0;
for(int i=2;i<=maxn;i++)
{
if(b[i])
prime[++cnt]=i;
for(int j=1;j<=cnt&&prime[j]*i<=maxn;j++)
{
b[prime[j]*i]=0;
if(i%prime[j]==0) break;
}
}
}
int main()
{
iint();
ll n;
while(scanf("%lld",&n)!=EOF)
{
if(b[n]==1)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
纯素数
注意取模是用pow会出现不知名的错误,因此用t*10模拟
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e7+1;
int prime[N];
bool b[N];
int cnt=0,maxn=1e7;
void iint()
{
memset(b,1,sizeof(b));
b[0]=b[1]=0;
for(int i=2;i<=maxn;i++)
{
if(b[i])
prime[++cnt]=i;
for(int j=1;j<=cnt&&prime[j]*i<=maxn;j++)
{
b[prime[j]*i]=0;
if(i%prime[j]==0) break;
}
}
}
int main()
{
iint();
ll n,m,t;
while(scanf("%lld",&n)!=EOF)
{
int flag=1;
t=10;
while(1)
{
m=n%t;
//cout<<t<<" "<<m<<endl;
if(b[m]==0)
{
flag=0;
break;
}
if(m==n) break;
t*=10;
}
if(flag==1)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
半素数
longlong 超时!
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+1;
int prime[N];
bool b[N];
int cnt=0,maxn=1e6;
void iint()
{
memset(b,1,sizeof(b));
b[0]=b[1]=0;
for(int i=2;i<=maxn;i++)
{
if(b[i])
prime[++cnt]=i;
for(int j=1;j<=cnt&&prime[j]*i<=maxn;j++)
{
b[prime[j]*i]=0;
if(i%prime[j]==0) break;
}
}
}
bool judge(int n)
{
for(int i=1;i<=sqrt(n);i++)
{
if(n%i==0&&b[i]&&b[n/i])
return 1;
}
return 0;
}
int main()
{
iint();
int n;
while(scanf("%d",&n)!=EOF)
{
if(judge(n)==1)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
素数与数论
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+1;
int prime[N],pre[N];//pre记录到每个数位置一共有几个素数
bool b[N];
int x,y,cnt=0,maxn=N;
void iint()
{
memset(b,1,sizeof(b));
b[0]=b[1]=0;
pre[1]=0;
for(int i=2;i<=maxn;i++)
{
if(b[i])
prime[++cnt]=i;
for(int j=1;j<=cnt&&prime[j]*i<=maxn;j++)
{
b[prime[j]*i]=0;
if(i%prime[j]==0) break;
}
pre[i]=cnt;
}
}
int main()
{
ios::sync_with_stdio(false);
iint();
while(cin>>x>>y)
{
printf("%d\n",pre[y]-pre[x-1]);
}
return 0;
}
五十弦翻塞外声
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+3;
ll T,n,cnt,prime[N+10];
bool b[N+10];
void get_prime()
{
memset(b,1,sizeof(b));
b[0]=b[1]=0;
for(int i=2;i<=N;i++)
{
if(b[i]) prime[++cnt]=i;
for(int j=1;j<=cnt&&prime[j]*i<=N;j++)
{
b[prime[j]*i]=0;
if(i%prime[j]==0) break;
}
}
}
ll f(ll x)
{
ll s=1;
for(ll i=1;prime[i]*prime[i]<=x;i++)
{
if(x%prime[i]==0)
{
ll t=1,t1=1;
while(x%prime[i]==0)
{
t1*=prime[i];
t+=t1;
x/=prime[i];
}
s*=t;
}
}
if(x>1) s*=(1+x);
return s;
}
int main()
{
ios::sync_with_stdio(false);
get_prime();
cin>>T;
while(T--)
{
cin>>n;
printf("%lld\n",f(n));
}
return 0;
}