題意:操作0表示某數有n個約數,操作1為某數有n個非約數;n <= 47777,若是存在小於2^62的數符合,則輸出該數,否則若是不存在輸出illegal,若是大於2^62輸出inf;
sample input
30 3
1 3
0 10
sample output
case 1: 4
case 2: 5
case 3: 48
思路:對於確定的約數個數(操作0),可以直接建搜尋樹,深搜即可;裡面用了剪枝優化,即當素因子從小到大排序時,指數不遞增;還有就是由於各個不同的質因數的指數是按照乘法原理得到最終的約數的,所以每次得到的約數必須能整除最終的約數個數;
對於操作1來說,看了acdreams
的,裡面並沒有證明為什麼直接可以遞推到比最大約數個數47777大一些的50005既可以確定d[i]為0時,後面就不可能在出現非約數個數為i的數了;我也沒有證明出來...
時間複雜度為o(nlog(n)) 15ms
#include#includeview code#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
#define rep0(i,l,r) for(int i = (l);i < (r);i++)
#define rep1(i,l,r) for(int i = (l);i <= (r);i++)
#define rep_0(i,r,l) for(int i = (r);i > (l);i--)
#define rep_1(i,r,l) for(int i = (r);i >= (l);i--)
#define ms0(a) memset(a,0,sizeof(a))
#define ms1(a) memset(a,-1,sizeof(a))
#define msi(a) memset(a,0x3f,sizeof(a))
#define lson l, m, rt << 1
#define rson m+1, r, rt << 1|1typedef pair
pii;
#define a first
#define b second
#define mk make_pairtypedef __int64 ll;
template
void read1(t &m)
while(ch>='
0'&&ch<='9')
m = x*f;
}template
void read2(t &a,t &b)
template
void read3(t &a,t &b,t &c)
template
void
out(t a)
const
int n = 50005
;typedef unsigned
long
long
ull;
const ull inf = (1ull<<62
);int
d[n];
void
init()
//rep1(i,1,100)if(d[i] == 0)
int p[16] = ;
intn;
ull ans;
void dfs(int dept,ull val,int num,int
last)
for(int i = 1;i <= last;i++)
}int
main()
printf(
"case %d:
",kase++);
if(ans > inf) puts("
inf"
);
else
if(ans == 0) puts("
illegal");
else
}return0;
}
HDU4542 未知剩餘系 反素數
題目大意 兩種操作 type為0是讓求出約數為k的最小的整數n type為1是讓求有k個數不是n的約數的最小的n。分析 資料範圍為0到47777,對於type為0的情況,就是找出約數為k的最小的反素數 對於type為1,打表就行。實現 如下 includetypedef long long ll c...
hdu4542 求反素數
題意problem description 今有物不知其數,三三數之有二,五五數之有三,七七數之有二,問物幾何?這個簡單的謎題就是中國剩餘定理的來歷。在艱難地弄懂了這個定理之後,小明開始設計一些複雜的同餘方程組x mod ai bi 來調戲別人,結果是必然的,都失敗了。可是在這個過程中,小明發現有時...
小明系列故事 買年貨(HDU)
題意理解 有n個可以買的年貨,每個年貨有單價,抵扣的積分和實際的價值,小明手裡有v1的錢,v2的積分,可免費的年貨數量k。問如何買才能使年貨總的價值最大?問題分析 多維01揹包問題,用dp。動態規劃要找狀態,然後找狀態轉移方程。對於本題,狀態是dp ii jj kk ll 表示前ii個年貨花了jj錢...