日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

B. super_log(2019ICPC区域网络赛南京站)

發布時間:2025/3/20 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 B. super_log(2019ICPC区域网络赛南京站) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接:https://nanti.jisuanke.com/t/41299

題目大意

已知函數loga?log_a^*loga??形式如下:
loga?(x)={?1,?if?x<11+loga?(logax),?if?x≥1log_a^*(x)= \begin{cases} -1 & \text{, if x<1} \\ 1+log_a^*(log_ax) & \text{, if x} \geq1 \end{cases} loga??(x)={?11+loga??(loga?x)?,?if?x<1,?if?x1?
現在給出a,b,ma,b,ma,b,m,要找到最小的正整數xxx,使得loga?(x)≥blog_a^*(x) \geq bloga??(x)b。由于xxx可能很大,所以需要取模mmm

題目分析

多造幾組a,ba,ba,b去算xxx,可以發現這個問題就是求:
aaa...?btimesmodm\underbrace{a^{a^{a^{...}}}}_{b \text{ times}} mod \, m b?timesaaa...??modm

因為暴力求這個數的過程量會非常大,所以需要對過程量取模。但是過程量是指數,我們不能直接對其取模,這里就需要用上歐拉降冪。
ab≡{ab%φ(p)(modp),?gcd(a,?p)=1ab(modp),?b?<φ(p)ab%φ(p)+φ(p)(modp),?b≥φ(p)a^b \equiv \begin{cases} a^{b\% \varphi(p)} \, (mod \, p) & \text{, \,gcd(a, p)=1} \\ a^b \quad (mod \, p) & \text{, \, b <} \varphi(p) \\ a^{b\% \varphi(p) + \varphi(p)} \, (mod \, p) & \text{, \, b} \geq \varphi(p) \\ \end{cases} ab??????ab%φ(p)(modp)ab(modp)ab%φ(p)+φ(p)(modp)?,?gcd(a,?p)=1,?b?<φ(p),?bφ(p)?
知道了這些就里答案很接近了,我們可以每次都把問題遞歸分解為求利用歐拉降冪解指數部分的值,回歸時再計算層指數運算的結果。

要注意:除了分解了bbb次可以返回之外,歐拉函數迭代到1也可以提前返回,可以減少大量不必要的運算。

黑歷史記錄:

  • 沒有想到模數的歐拉函數迭代到1可以提前返回的情況,因為任何正整數取模1都等于0,所以沒必要再繼續運算。
  • 沒有考慮到歐拉函數迭代到1是返回值為0時的處理1。

代碼如下

#include <iostream> #include <cstdio>using namespace std; typedef long long ll; const int maxn = 1e6 + 10; int T, a, b ,m; int phi[maxn]; ll prime[maxn]; bool vis[maxn]; //快速冪 ll quick_pow(ll x, ll n, ll Mod) {ll res = 1;while (n) {if (n & 1) res = (res * x) % Mod;x = (x * x) % Mod;n >>= 1;}return res; } //線性篩篩求歐拉函數 void getphi(int n) {int i, j, tot = 0;phi[1] = 1;for (int i = 2; i <= n; i++) {if (!vis[i]) {prime[++tot] = i;phi[i] = i - 1;}for (int j = 1; j <= tot && i * prime[j] <= n; j++) {vis[i * prime[j]] = 1;if (i % prime[j] == 0) {phi[i * prime[j]] = phi[i] * prime[j];break;} else {phi[i * prime[j]] = phi[i] * (prime[j] - 1);}}} }int dfs(int a, int b, int m) {//歐拉函數迭代到1if (m == 1) return 0;//已經迭代到最后一次了if (b == 0) return 1;int x = dfs(a, b - 1, phi[m]);//x為0是歐拉函數迭代到1返回的if (x < phi[m] && x) return quick_pow(a, x, m);else return quick_pow(a, x + phi[m], m); }int main() {getphi(maxn-10);scanf("%d", &T);while (T--) {scanf("%d %d %d", &a, &b, &m);printf("%d\n", dfs(a, b, m));}return 0; }

參考鏈接

  • https://www.cnblogs.com/ACMLCZH/p/8117161.html?tdsourcetag=s_pctim_aiomsg
  • 總結

    以上是生活随笔為你收集整理的B. super_log(2019ICPC区域网络赛南京站)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。