反素数ant HYSBZ - 1053(数学+dfs)
作者:互联网
对于任何正整数x,其约数的个数记作g(x)。例如g(1)=1、g(6)=4。如果某个正整数x满足:g(x)>g(i) 0<i<x
,则称x为反质数。例如,整数1,2,4,6等都是反质数。现在给定一个数N,你能求出不超过N的最大的反质数么?
Input
一个数N(1<=N<=2,000,000,000)。
Output不超过N的最大的反质数。
Sample Input 1000Sample Output
840
思路:对n分解质因数,是不会超过10个的,而且质因数个数不会超过30,通过反质数定义,可以dfs搜索10个素数的指数。
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int n; 5 int prime[20]; 6 int tot; 7 typedef long long ll; 8 void get_pri(int n) 9 { 10 bool v[n+5]; 11 memset(v,0,sizeof(v)); 12 for(int i=2;i<=n;i++) 13 { 14 if(!v[i])prime[++tot] = i; 15 for(int j=i;j<=n/i;j++) 16 { 17 v[i*j] = 1; 18 } 19 } 20 } 21 int tmp[20]; 22 ll ans; 23 int t_cnt; 24 25 ll qpow(ll a,ll b) 26 { 27 ll ans = 1; 28 ll base = a; 29 while(b) 30 { 31 if(b&1)ans *= base; 32 base *= base; 33 b >>= 1; 34 } 35 return ans; 36 } 37 38 void dfs(int now,ll val,int cnt) 39 { 40 if(val > n)return; 41 if(now > 10) 42 { 43 if((cnt == t_cnt && val < ans)|| cnt > t_cnt) 44 { 45 ans = val; 46 t_cnt = cnt; 47 } 48 return; 49 } 50 for(int i=0;i<=tmp[now-1];i++) 51 { 52 tmp[now] = i; 53 ll tmp = val*qpow(prime[now],i); 54 dfs(now+1,tmp,cnt*(i+1)); 55 if(tmp > n)break; 56 } 57 } 58 59 int main() 60 { 61 ans = 0x3f3f3f3f3f3f3f3f; 62 t_cnt = 0; 63 tot = 0; 64 get_pri(30); 65 tmp[0] = 30; 66 scanf("%d",&n); 67 dfs(1,1,1); 68 printf("%lld\n",ans); 69 }View Code
标签:10,cnt,1053,val,int,HYSBZ,dfs,ans 来源: https://www.cnblogs.com/iwannabe/p/10693112.html