P1463 反素数(打表)
打表
小表:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int const N=1e6+7;
int f(int x){
int s=0;
for(int i=1;i<=x/i;++i){
if(x%i==0) s+=2;
if(i*i==x) s--;
}
return s;
}
int main(){
ll mx=0,pre=0;
int n=5000000;
for(int i=1;i<=n;++i){
int z=f(i);
if(mx<z){
mx=z;
//printf("%d,",i);
printf("%9d 与上一个的差值:%d\n",i,i-pre);
pre=i;
}
}
return 0;
}
大表
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n;
int f(int x){
int s=0;
for(int i=1;i<=x/i;++i){
if(x%i==0) s+=2;
if(i*i==x) s--;
}
return s;
}
int f2(ll& i){ //打表时,跳表要保守点
if(i<12) return 1;
if(i<60) return 12;
if(i<2520) return 60;
if(i<55440) return 420;
if(i<720720) return 2520;
return 360360;
}
int main(){
n=2e9;
ll mx=0,z;
for(ll i=1;i<=n;i+=f2(i)){
z=f(i);
if(mx<z){
mx=z;
printf("%d,",i);
}
}
return 0;
}
小表和大表一定要比对
ac代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int const N=1e6+7;
ll n;
ll a[N]={1,2,4,6,12,24,36,48,60,120,180,240,360,720,840,1260,1680,2520,5040,7560,10080,15120,20160,25200,27720,45360,50400,55440,83160,110880,166320,221760,277200,332640,498960,554400,665280,720720,1081080,1441440,2162160,2882880,3603600,4324320,6486480,7207200,8648640,10810800,14414400,17297280,21621600,32432400,36756720,43243200,61261200,73513440,110270160,122522400,147026880,183783600,245044800,294053760,367567200,551350800,698377680,735134400,1102701600,1396755360,2100000000};
int main(){
cin >> n;
for(int i=0;i<N;++i){
if(a[i]>n){
cout << a[i-1];
return 0;
}
}
return 0;
}
