两道简单的素数——POJ - 1365,POJ - 2739
两道简单的素数题
第一道
简单的筛一下素数,然后模拟就行了
题目代码
#include<stdio.h> #include<iostream> #include<string.h> using namespace std; typedef long long LL; const int maxn=33000; int prime[maxn]; bool check[maxn]; int cnt=0; void Prime(){ for(int i=2;i<maxn;i++) if(!check[i]){ prime[cnt++]=i; for(int j=i*i;j<maxn;j+=i) check[j]=true; } } bool solve(LL x){ int pp[maxn],nn[maxn],num=0; for(int i=0;i<cnt;i++) if(x%prime[i]==0){ pp[num]=prime[i]; nn[num]=0; while(x%prime[i]==0){ nn[num]++; x/=prime[i]; } num++; } for(int i=num-1;i>=0;i--) printf("%d %d ",pp[i],nn[i]); printf("\n"); } int n,m; char ch; int main(){ Prime(); while(scanf("%d",&n)){ if(n==0)break; LL sum=1; scanf("%d",&m); for(int i=1;i<=m;i++) sum*=n; while(ch=getchar()){ if(ch=='\n')break; scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) sum*=n; } solve(sum-1); } return 0; }
第二道
注意是连续素数!注意是连续素数!
我第一次没注意,所以死活找不出错来
既然是连续的,在素数序列里找一下哪些相加为x就行了
题目代码
#include<stdio.h> #include<iostream> #include<string.h> using namespace std; typedef long long LL; const int maxn=10007; int prime[maxn]; bool check[maxn]; int cnt=0; void Prime(){ for(int i=2;i<maxn;i++) if(!check[i]){ prime[cnt++]=i; for(int j=i*i;j<maxn;j+=i) check[j]=true; } } int solve(int x){ int ans=0; for(int i=0;prime[i]<=x;i++){ int t=prime[i]; for(int j=i+1;j<cnt;j++){ if(t==x){ ans++; break; } else if(t>x)break; t+=prime[j]; } } return ans; } int n; int main(){ Prime(); while(scanf("%d",&n)){ if(n==0)break; printf("%d\n",solve(n)); } return 0; }