洛谷P1463 [SDOI2005]反素数ant
2017-07-17 08:41
274 查看
题目描述
对于任何正整数x,其约数的个数记作g(x)。例如g(1)=1、g(6)=4。
如果某个正整数x满足:g(x)>g(i),0<i<x则称x为反质数。例如,整数1,2,4,6等都是反质数。
现在给定一个数N,你能求出不超过N的最大的反质数么?
输入输出格式
输入格式:
一个数N(1<=N<=2,000,000,000)。
输出格式:
不超过N的最大的反质数。
输入输出样例
输入样例#1:
1000
输出样例#1:
840
对于任何正整数x,其约数的个数记作g(x)。例如g(1)=1、g(6)=4。
如果某个正整数x满足:g(x)>g(i),0<i<x则称x为反质数。例如,整数1,2,4,6等都是反质数。
现在给定一个数N,你能求出不超过N的最大的反质数么?
输入输出格式
输入格式:
一个数N(1<=N<=2,000,000,000)。
输出格式:
不超过N的最大的反质数。
输入输出样例
输入样例#1:
1000
输出样例#1:
840
#include <iostream> #define ll long long using namespace std; const int prime[14]={0,2,3,5,7,11,13,17,19,23,29,31,37}; ll n,s[110],ans,mx; void dfs(int x,ll sum,ll mult) { if(x>12)//x>12时无论怎么取都比n的上界要大 return; if(sum>mx||sum==mx&&mult<ans) mx=sum,ans=mult;//根据反素数的定义,选择约数最多的或者是约数相同最大的值 s[x]=0; while(mult*prime[x]<=n&&s[x]<s[x-1]) {//保证值小于或等于n,并且在对所求得值分解质因数后得到的b=a1^p1 ·a2^p2 ·a3^p3 ……an^pn; //当中保证p1>=p2>=p3>=……>=pn 因为可以证明 在除p2和p3不同以外其他的pi均相同的情况下 //如果p3>p2那么所得的新数必然大于旧数,那么他就大于一个与他约数相等的数,所以新的数就不是反素数 s[x]++;//px++ mult*=prime[x];//所得的数 ll next=sum*(s[x]+1);//新的约数 dfs(x+1,next,mult);//继续用新的状态搜索 } } int main() { cin>>n; s[0]=100000; dfs(1,1,1); cout<<ans; return 0; } //这是一道搜索题...
相关文章推荐
- 洛谷 P1463 [SDOI2005]反素数ant && P1820 寻找AP数
- 暴力-洛谷P1463 [SDOI2005]反素数ant
- 洛谷 P1463 [SDOI2005]反素数ant && codevs2912反素数
- P1463 [SDOI2005]反素数ant
- 洛谷 P1463 [SDOI2005]反素数ant
- 洛谷 P1463 [HAOI2007]反素数ant
- [SDOI2005]反素数ant
- [SDOI2005]反素数ant 洛谷p1463
- 洛谷 P2335 [SDOI2005]位图
- 洛谷 P2335 [SDOI2005]位图
- [SDOI2005]反素数
- 洛谷P2434 [SDOI2005]区间
- 【洛谷2335】【SDOI2005】位图
- 洛谷 P2434 [SDOI2005]区间
- 【洛谷2439】【SDOI2005】阶梯教室设备利用
- 洛谷 P2434 [SDOI2005]区间
- 洛谷 P2449 [SDOI2005]矩形
- 洛谷 P2439 [SDOI2005]阶梯教室设备利用
- 洛谷 P2335 [SDOI2005]位图 [DP]
- SDOI2005反素数