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; }