反素数学习笔记

反素数就是1-x中因子数最多的数中最小的数

首先前15个素数的累和就会爆1e18,然后2的60也会爆1e18

反素数一定由不超过15个素数,指数非严格递减生成,这样就有了例题1的搜索框架

-------------------------------------------------------------------------------------------------------------------------------

例题1:给一个数n,求最小的数x让x的因子数为n

 1 //#include<bits/stdc++.h>  
 2 //#pragma comment(linker, "/STACK:1024000000,1024000000")   
 3 #include<stdio.h>  
 4 #include<algorithm>  
 5 #include<queue>  
 6 #include<string.h>  
 7 #include<iostream>  
 8 #include<math.h>                    
 9 #include<stack>
10 #include<set>  
11 #include<map>  
12 #include<vector>  
13 #include<iomanip> 
14 #include<bitset>
15 using namespace std;         //
16 
17 #define ll long long  
18 #define ull unsigned long long
19 #define pb push_back  
20 #define FOR(a) for(int i=1;i<=a;i++) 
21 #define sqr(a) (a)*(a)
22 #define dis(a,b) sqrt(sqr(a.x-b.x)+sqr(a.y-b.y))
23 ll qp(ll a,ll b,ll mod){
24     ll t=1;while(b){if(b&1)t=t*a%mod;b>>=1;a=a*a%mod;}return t;
25 }
26 struct DOT{int x;int y;};
27 inline void read(int &x){int k=0;char f=1;char c=getchar();for(;!isdigit(c);c=getchar())if(c=='-')f=-1;for(;isdigit(c);c=getchar())k=k*10+c-'0';x=k*f;} 
28 void ex(){puts("No");exit(0);}
29 const int dx[4]={0,0,-1,1};
30 const int dy[4]={1,-1,0,0};
31 const int inf=0x3f3f3f3f; 
32 const ll Linf=0x3f3f3f3f3f3f3f3fLL;
33 const ll Mod=1e18+7;
34 const double eps=1e-6;
35 const double pi=acos(-1.0);
36 
37 
38 const int prime[20]={1,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47};
39 
40 int n;
41 ll ans;
42 
43 void dfs(int dep,ll num,int cnt){
44     if(cnt>n)return;
45     if(cnt==n && ans>num)ans=num;
46     for(int i=1;i<=60;i++){
47         if(ans/prime[dep] < num)break;
48         
49         num*=prime[dep];
50 
51         dfs(dep+1,num,cnt*(i+1));
52     }
53 }
54 
55 int main(){
56     scanf("%d",&n);
57     ans=9e18;
58 
59     dfs(1,1,1);
60     printf("%lld\n",ans);
61 }
View Code

 -------------------------------------------------------------------------------------------------------------------------------

例题2:多组的例题1(x),加上了指数降级约束的版本

 1 //#include<bits/stdc++.h>  
 2 //#pragma comment(linker, "/STACK:1024000000,1024000000")   
 3 #include<stdio.h>  
 4 #include<algorithm>  
 5 #include<queue>  
 6 #include<string.h>  
 7 #include<iostream>  
 8 #include<math.h>                    
 9 #include<stack>
10 #include<set>  
11 #include<map>  
12 #include<vector>  
13 #include<iomanip> 
14 #include<bitset>
15 using namespace std;         //
16 
17 #define ll long long  
18 #define ull unsigned long long
19 #define pb push_back  
20 #define FOR(a) for(int i=1;i<=a;i++) 
21 #define sqr(a) (a)*(a)
22 #define dis(a,b) sqrt(sqr(a.x-b.x)+sqr(a.y-b.y))
23 ll qp(ll a,ll b,ll mod){
24     ll t=1;while(b){if(b&1)t=t*a%mod;b>>=1;a=a*a%mod;}return t;
25 }
26 struct DOT{int x;int y;};
27 inline void read(int &x){int k=0;char f=1;char c=getchar();for(;!isdigit(c);c=getchar())if(c=='-')f=-1;for(;isdigit(c);c=getchar())k=k*10+c-'0';x=k*f;} 
28 void ex(){puts("No");exit(0);}
29 const int dx[4]={0,0,-1,1};
30 const int dy[4]={1,-1,0,0};
31 const int inf=0x3f3f3f3f; 
32 const ll Linf=0x3f3f3f3f3f3f3f3fLL;
33 const ll Mod=1e18+7;
34 const double eps=1e-6;
35 const double pi=acos(-1.0);
36 
37 
38 const int prime[20]={1,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53};
39 
40 ll n;
41 ll ans;
42 int bst_cnt;
43 
44 void dfs(int dep,int limit,ll now,int cnt){
45     if(now>n)return;
46     if(cnt>bst_cnt){
47         bst_cnt=cnt;
48         ans=now;
49     }
50     if(cnt==bst_cnt && ans>now){ans=now;}
51     for(int i=1;i<=limit;i++){
52         double cur=(double)now;
53 
54         if(n<cur*prime[dep])break;
55         dfs(dep+1,i,now*=prime[dep],cnt*(i+1));
56     }
57 }
58 
59 int main(){
60     int T;
61     scanf("%d",&T);
62     while(T--){
63         scanf("%lld",&n);
64         ans=Linf;
65         bst_cnt=0;
66         dfs(1,60,1,1);
67         printf("%lld %d\n",ans,bst_cnt);
68     }    
69 }
View Code

 

posted @ 2018-03-31 00:02  Drenight  阅读(143)  评论(0编辑  收藏  举报