清一色的筛质数,数论有点麻烦,题目又是英文的,看不懂欸,看来学英语很重要啊。
参考程序:
3126:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<cmath>
#define maxn 11000
using namespace std;
struct Prime{
int f[maxn];
bool ok[maxn];
int n;
int cnt;
void make(){
n=maxn;cnt=0;
memset(ok,1,sizeof(ok));
ok[1]=ok[0]=false;
int m=floor(sqrt(n+0.5));
for (int i=2;i<=m;i++)
if (ok[i])
for (int j=i*i;j<=n;j+=i)
ok[j]=false;
for (int i=2;i<=n;i++)
if (ok[i])
f[cnt++]=i;
}
}form;
int ans[maxn];
int next(int cur,int i,int j){
switch(i){
case 0:return j*1000+cur%1000;break;
case 1:return cur/1000*1000+j*100+cur%100;break;
case 2:return cur/100*100+j*10+cur%10;break;
case 3:return cur/10*10+j;break;
}
return 0;
}
int main(){
form.make();
int T;
scanf("%d",&T);
while(T--){
int from,to;
scanf("%d%d",&from,&to);
queue<int> Q;
memset(ans,0x3f,sizeof(ans));
ans[from]=0;Q.push(from);
while (!Q.empty()){
int cur=Q.front();Q.pop();
for (int i=0;i<4;i++){
for (int j=0;j<10;j++){
if (i==0 && j==0)continue;
int now=next(cur,i,j);
if (form.ok[now]==true && ans[now]>ans[cur]){
ans[now]=ans[cur]+1;
Q.push(now);
}
}
}
}
printf("%d\n",ans[to]);
}
return 0;
}
3421:
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
typedef unsigned long long ULL;
struct Prime{
int sum,n,length,way;
vector<int> tt;
void init(int n){
this->n=n;
}
void maxlength(){
for (int i=2;i*i<=n;i++){
int times=0;
while (n%i==0){
times++;
n/=i;
}
tt.push_back(times);
}
if (n!=1)tt.push_back(1);
sum=0;
for (int i=0;i<tt.size();i++)sum+=tt[i];
length=sum;
}
ULL factor(int n){
ULL ans=1;
for (int i=2;i<=n;i++)
ans*=i;
return ans;
}
void ways(){
way=factor(sum);
for (int i=0;i<tt.size();i++)
way/=factor(tt[i]);
}
}res;
int main(){
int X;
while (scanf("%d",&X)==1){
res.init(X);res.maxlength();res.ways();
printf("%d %d",res.length,res.way);
}
return 0;
}
#include<cstdio>
#include<algorithm>
#include<cstring>
#define maxn 1000001
using namespace std;
struct Prime{
bool HS[maxn];
bool h[maxn];
int H[maxn],Hs[maxn];
int cnt;
void prime(){
memset(h,0,sizeof(h));
cnt=0;
for (int i=5;i<maxn;i+=4)
if (!h[i]){
H[cnt++]=i;
for (int j=5*i;j<maxn;j+=4*i)
h[j]=true;
}
}
void Sum(){
memset(HS,0,sizeof(HS));
memset(Hs,0,sizeof(Hs));
for (int i=0;i<cnt;i++)
for (int j=0;j<i+1;j++){
unsigned long long cmp=H[i]*H[j];
if (cmp>maxn)break;
HS[cmp]=true;
}
for (int i=1;i<maxn;i++)
Hs[i]=Hs[i-1]+HS[i];
}
}form;
int main(){
form.prime();
form.Sum();
int n;
while (scanf("%d",&n)==1 && n){
printf("%d %d\n",n,form.Hs[n]);
}
return 0;
}