【題目整理】反素數
阿新 • • 發佈:2018-11-10
目錄
Codeforces27E Number With The Given Amount Of Divisors(模板題)
Codeforces27E Number With The Given Amount Of Divisors(模板題)
【題意】
給定一個數,求一個最小的正整數,使得的約數個數為。
【解題思路】
模板題。
【程式碼】
#include<bits/stdc++.h> using namespace std; typedef unsigned long long ull; const ull INF=~0ull; ull n,ans,ansnum=0,s[1005]; int prime[]={1,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53}; void dfs(int k,int num,ull x) { if(num>n)return; if(num==n && ans>x)ans=x; s[k]=0; while(x*prime[k]<=ans && s[k]<s[k-1]) { x*=prime[k]; s[k]++; dfs(k+1,num*(s[k]+1),x); } } int main() { while(~scanf("%lld",&n)) { ans=INF; s[0]=INF; dfs(1,1,1); printf("%lld\n",ans); } }
zoj 2562 More Divisors(模板題)
【題意】
求出中約數個數最多的這個數。
【解題思路】
模板題。
【程式碼】
#include<bits/stdc++.h> using namespace std; typedef long long LL; const int INF=0x3f3f3f3f; LL n,ans,ansnum=0,s[1005]; int prime[]={1,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53}; //n是10^16所以16個素數就可以了,如果n是10^9次那麼家個素數即可 //k:列舉到第k大的因子 num:約數的個數 x:當前列舉到的數 void dfs(int k,int num,LL x) { if(k>16)return; if(num>ansnum || (num==ansnum && x<ans)) { ans=x; ansnum=num; //printf("ansnum=%lld,ans=%lld\n",ansnum,ans); } s[k]=0; while(x*prime[k]<=n && s[k]<s[k-1]) { x*=prime[k]; s[k]++; dfs(k+1,num*(s[k]+1),x); //printf("num=%lld,x=%lld\n",num,x); } } int main() { while(~scanf("%lld",&n)) { ansnum=0; ans=INF; s[0]=INF; dfs(1,1,1); printf("%lld\n",ans); } return 0; }