給定正整數 n,kn, kn,
k,已知非負整數 xx
x 滿足 n
!modkx
=0,求 xmaxx_x
max
。本題包含多組資料,請處理至檔案末尾。
對於每組資料,共有一行,兩個整數,表示 n,kn, kn,
k。對於每組資料,輸出一行,乙個整數,表示 xmaxx_x
max
。輸入樣例
10 2
5000000000000000000 2
5000000000000000000 10000000000000
輸出樣例
8
4999999999999999981
96153846153846153
對於 40%40\%40
% 的資料,k⩽2×107k \leqslant 2\times 10^7k⩽
2×10
7
,n⩽2×109n \leqslant 2\times 10^9n⩽
2×10
9
,資料組數 ⩽50 \leqslant 50⩽5
0。對於 100%100\%10
0%的資料,11
101
3,1⩽n⩽5×10181 \leqslant n \leqslant 5\times 10^1⩽
n⩽5×
101
8,資料組數 ⩽200\leqslant 200⩽2
00。
由n!%kx=0可得:k^x必定是n!的乙個約數,所以k中的質因數在$n!$肯定都存在,只是k中質因子的指數小於等於n!中的質因子的指數。
假如我們現在已經知道了k的每個質因數及其指數:p1
c1 p2
c2... pmcm
我們還知道n!的每個質因子及其指數:p1
d1p2
d2 ...pm
dm那麼可以得到:
$c1*x_1<=d1$$c_2*x_2<=d_2$ ... $c_m*x_m<=d_m$
可以知道$$min$$便是滿足條件的最大的x。
現在將問題轉換為求k和n!的質因數及其指數了。
對於k的質因數和指數我們可以在$\sqrt$的時間內求得,
而n!可以在$\log*\sqrt$的時間內得到。
#includeusingnamespace
std;
#define uint unsigned int
#define re register int
#define ll long long
#define inf 0x3f3f3f3f
#define maxn 5000009
#define maxminline ll read()
while(ch>='
0'&&ch<='9')
return x*f;
}bool
v[maxn];
ll prime[maxn];
ll n,m,k,ans,tot,cnt;
void
prime()
}}ll cal(ll x,ll y)
intmain()
}if(k!=1
) ans=min(ans,cal(n,k));
printf(
"%lld\n
",ans);
}fclose(stdin);
fclose(stdout);
return0;
}
數論
數論
LOJ6303 水題 題解
題目來自loj。就記乙個公式,設f n,k 為n 裡分解得到的k k為質數 的個數,則f n,k f n k,k n k。證明很好證,顯然我們要的只有k,k 2,k 3 這樣的數有n k個,然後往下遞迴即可。至於k為合數,就質因數分解做就行。k的質因子最多o logk 個,遞迴顯然是o logn 的...
LOJ 6165 一道水題(線性篩)
題目鏈結 題解 很顯然的做法就是求 1,n 所有數的最小公倍數 所以我們只需要把 1,n 中的每個素因子的最高次冪提取出來連乘即可 剛開始沒看到模數是1e8 7,被坑了一次wa ac pragma gcc optimize 2 include using namespace std typedef ...
字尾陣列水水水水水水題
首先 jxrjxrjxr orz,沒有您我們都會死 然後就是我從jxr神犇那裡借鑑 照抄 過來的字尾陣列模板。include include include define cmp x y sa i x y sa i 1 x using namespace std const int n 100000...