HDU 4542 小明系列故事——未知剩餘系 (DFS 反素數 篩子預處理)
小明系列故事——未知剩餘系
Time Limit: 500/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 1190 Accepted Submission(s): 292
Problem Description
“今有物不知其數,三三數之有二,五五數之有三,七七數之有二,問物幾何?”
這個簡單的謎題就是中國剩餘定理的來歷。
在艱難地弄懂了這個定理之後,小明開始設計一些複雜的同餘方程組X mod ai = bi 來調戲別人,結果是必然的,都失敗了。
可是在這個過程中,小明發現有時並不一定要把ai和bi告訴你。他只需要告訴你,ai在區間 [1, X] 範圍內每個值取一次時,有K個ai使bi等於0,或有K個ai使bi不等於0,最小的X就可以求出來了。
你來試試看吧!
這個簡單的謎題就是中國剩餘定理的來歷。
在艱難地弄懂了這個定理之後,小明開始設計一些複雜的同餘方程組X mod ai = bi 來調戲別人,結果是必然的,都失敗了。
可是在這個過程中,小明發現有時並不一定要把ai和bi告訴你。他只需要告訴你,ai在區間 [1, X] 範圍內每個值取一次時,有K個ai使bi等於0,或有K個ai使bi不等於0,最小的X就可以求出來了。
你來試試看吧!
Input
輸入第一行為T,表示有T組測試資料。
每組資料包含兩個整數Type和K,表示小明給出的條件。Type為0表示“有K個ai使bi等於0”,為1表示“有K個ai使bi不等於0”。
[Technical Specification]
1. 1 <= T <= 477
2. 1 <= K <= 47777, Type = 0 | 1
每組資料包含兩個整數Type和K,表示小明給出的條件。Type為0表示“有K個ai使bi等於0”,為1表示“有K個ai使bi不等於0”。
[Technical Specification]
1. 1 <= T <= 477
2. 1 <= K <= 47777, Type = 0 | 1
Output
對每組資料,先輸出為第幾組資料,如果沒有這樣的數,輸出“Illegal”,否則輸出滿足條件的最小的X,如果答案大於2^62, 則輸出“INF”。
Sample Input
3
0 3
1 3
0 10
Sample Output
Case 1: 4
Case 2: 5
Case 3: 48
Source
題目分析:0的時候就是求反素數,直接DFS,見之前的文章,1的時候通過nlogn的預處理,可以O(1)查詢
#include <cstdio>
#include <algorithm>
#define ull unsigned long long
using namespace std;
ull const INF = 1ull << 62 + 1;
int const LIM = 0x3fffffff;
int const MAX = 50000;
ull k, ans, ma;
bool flag;
int p[16] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47};
int re[MAX], num[MAX];
void DFS(int pos, ull val, ull num)
{
if(num > k || pos > 14)
return;
if(num == k)
{
flag = true;
ans = min(ans, val);
return;
}
for(int i = 1; i <= 62; i++)
{
if(val > ans / p[pos] || num * (i + 1) > k)
break;
val *= p[pos];
if(k % (num * (i + 1)) == 0)
DFS(pos + 1, val, num * (i + 1));
}
return;
}
void pre()
{
//re[i]記錄的是與i互質的數的個數
//num[i]記錄的是與i互質的個數中最小的那個
for(int i = 1; i <= MAX; i++)
{
num[i] = LIM;
re[i] = i - 1;
}
for(int i = 1; i <= MAX; i++)
for(int j = i + i; j <= MAX; j += i)
re[j] --;
for(int i = 1; i <= MAX; i++)
num[re[i]] = min(num[re[i]], i);
}
int main()
{
pre();
int T, ca = 1;
scanf("%d", &T);
while(T--)
{
int tp;
scanf("%d %llu", &tp, &k);
printf("Case %d: ", ca ++);
if(tp == 0)
{
ans = INF;
DFS(0, 1, 1);
if(!flag)
printf("Illegal\n");
else if(ans == INF)
printf("INF\n");
else
printf("%llu\n", ans);
}
else
{
if(num[k] == LIM)
printf("Illegal\n");
else
printf("%d\n",num[k]);
}
}
}
相關文章
- hdu ---(4517)小小明系列故事——遊戲的煩惱(Dp)遊戲
- hdu 1792 A New Change Problem 剩餘系
- HDU 5317 RGCDQ (素因子分解+預處理)GC
- 素數個數 <埃式篩 && 尤拉篩>
- 【數論】素數篩法
- Find Terrorists(素數篩選+素因子分解)Error
- HDU 2478 Slides(瞎搞,預處理)IDE
- HDU 4455 Substrings(預處理+dp)
- Bell(hdu4767+矩陣+中國剩餘定理+bell數+Stirling數+歐幾里德)矩陣
- [演算法]: 素數篩法演算法
- HDU1788Chinese remainder theorem again(中國剩餘定理 簡單)REMAI
- 中國剩餘定理
- DFS lock handle事件處理事件
- 數論線性篩總結 (素數篩,尤拉函式篩,莫比烏斯函式篩,前n個數的約數個數篩)函式
- 處理歸檔滿了fast_recovery_area無剩餘空間的案例AST
- HDU3944 DP? (LUCAS定理+階乘預處理)
- Diff-prime Pairs(思維+素數篩)AI
- HDU 4497GCD and LCM(素數分解)GC
- JavaScript 剩餘運算子JavaScript
- hdu5435 數位dp(大數的處理)
- jQuery 篩選&文件處理jQuery
- HDU 4497 GCD and LCM(拆素數+組合)GC
- X問題(中國剩餘定理+不互質版應用)hdu1573
- 中國剩餘定理詳解
- 中國剩餘定理(構造)
- 【DFS】HDU 5423 Rikka with Tree
- HDU 5439 Aggregated Counting(找規律+預處理)
- HDU4675 GCD of Sequence(預處理階乘逆元+推公式)GC公式
- ES6箭頭函式的剩餘引數函式
- HDU44979 GCD and LCM (素因子分解+計數)GC
- 影像行畫素處理
- webgl 影像處理2---影像畫素處理Web
- 『Android』 獲取檔案系統剩餘空間Android
- 中國剩餘定理(個人筆記)筆記
- 擴充套件中國剩餘定理套件
- js獲取當前月份剩餘的天數程式碼JS
- 面試官本拿求素數搞我,但被我優雅的“回擊“了(素數篩)面試
- 洛谷P3383 【模板】線性篩素數