反素数
做题碰到了反素数,学习了下http://blog.****.net/acdreamers/article/details/25049767
反素数的定义:对于任何正整数,其约数个数记为
,例如
,如果某个正整数
满足:对任意的正整
数,都有
,那么称
为反素数。
从反素数的定义中可以看出两个性质:
(1)一个反素数的所有质因子必然是从2开始的连续若干个质数,因为反素数是保证约数个数为的这个数
尽量小
(2)同样的道理,如果,那么必有
More Divisors
题意:求小于n的因子最多的数。
1 #include <cstdio> 2 #include <iostream> 3 using namespace std; 4 #define ll long long 5 ll n,ans; 6 ll best; 7 int pri[16]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47}; 8 //ct用到了性质2 9 void dfs(int d,int ct,ll temp,ll num){ 10 if(d>=16) return; 11 if(num>best||num==best&&ans>temp){ 12 ans=temp; 13 best=num; 14 } 15 for(int i=1;i<=ct;i++){ 16 if(n/pri[d]<temp) break; 17 temp*=pri[d]; 18 dfs(d+1,i,temp,num*(i+1)); //选i个pri[d],因子变为num*(i+1) 19 } 20 } 21 int main(){ 22 while(scanf("%lld",&n)!=EOF){ 23 ans=1e18; 24 best=0; 25 dfs(0,60,1,1); 26 printf("%lld ",ans); 27 } 28 }
Number With The Given Amount Of Divisors
题意:求因数为n的最小正整数。
1 #include <bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 int n; 5 ll ans; 6 int pri[16]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47}; 7 8 void dfs(int d,int ct,ll temp,int num){ 9 if(num>n) return ; 10 if(num==n&&temp<ans) ans=temp; 11 for(int i=1;i<=ct;i++){ 12 if(ans<pri[d]*temp) break; 13 dfs(d+1,i,temp*=pri[d],num*(i+1)); 14 } 15 } 16 int main(){ 17 scanf("%d",&n); 18 ans=1e18; 19 dfs(0,60,1,1); 20 printf("%lld ",ans); 21 }