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




全部评论

相关推荐

FieldMatching:看成了猪头顾问,不好意思
点赞 评论 收藏
分享
05-03 12:45
西南大学 Java
sdgfdv:你这项目写的内容太多了,说实话都是在给自己挖坑,就算简历过了,后面面试也难受
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务