Acwing202. 最幸运的数字
Acwing202. 最幸運的數(shù)字
題意:
現(xiàn)在給定一個正整數(shù) L,請問至少多少個 8 連在一起組成的正整數(shù)(即最小幸運數(shù)字)是 L 的倍數(shù)。
題解:
x個8連在一起組成的正整數(shù)可寫作8(10x?1)/98(10^x-1)/98(10x?1)/9。現(xiàn)在要求一個最小的x,滿足L∣8(10x?1)9L|\frac{8(10^x-1)}{9}L∣98(10x?1)?.
L∣8(10x?1)9L|\frac{8(10^x-1)}{9}L∣98(10x?1)?=9L∣8(10x?1)9L|8(10^x-1)9L∣8(10x?1)
我們設(shè)d=gcd(L,8)
有:gcd(L/d,8/d)=1
說明8/d與L/d互質(zhì)
8(10^x-1)是9L的質(zhì)數(shù),有9Ld∣8d(10x?1)\frac{9L}ze8trgl8bvbq|\frac{8}ze8trgl8bvbq(10^x-1)d9L?∣d8?(10x?1)
因為8/d與L/d互質(zhì),所以9Ld∣(10x?1)\frac{9L}ze8trgl8bvbq|(10^x-1)d9L?∣(10x?1)
再推導有:10x≡1(mod9Ld)10^x \equiv1 (\bmod \frac{9L}ze8trgl8bvbq)10x≡1(modd9L?)
引理:
若正整數(shù)a,n互質(zhì),則滿足ax≡1(modn)a^x\equiv 1(\bmod n)ax≡1(modn)的最小正整數(shù)x0是?(n)的約數(shù)\phi(n)的約數(shù)?(n)的約數(shù)
所以我們只需要求出歐拉函數(shù)?(9Ld)\phi(\frac{9L}ze8trgl8bvbq)?(d9L?),枚舉它的所有約數(shù),用快速冪判斷是否符合條件即可。時間復雜度是O(Llog?L)O(\sqrt{L}\log{L})O(L?logL)
時間沒問題,但是注意,你的longlong會被下面數(shù)據(jù)爆掉,所以要用到一個小技巧,叫龜速乘
龜速乘其實就是把快速冪中乘法部分展開,將乘法轉(zhuǎn)成加法做,每次運算都取mod,這樣就不會爆
代碼:
#include <bits/stdc++.h> #include <unordered_map> #define debug(a, b) printf("%s = %d\n", a, b); using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<int, int> PII; clock_t startTime, endTime; //Fe~Jozky const ll INF_ll= 1e18; const int INF_int= 0x3f3f3f3f; void read(){}; template <typename _Tp, typename... _Tps> void read(_Tp& x, _Tps&... Ar) {x= 0;char c= getchar();bool flag= 0;while (c < '0' || c > '9')flag|= (c == '-'), c= getchar();while (c >= '0' && c <= '9')x= (x << 3) + (x << 1) + (c ^ 48), c= getchar();if (flag)x= -x;read(Ar...); } template <typename T> inline void write(T x) {if (x < 0) {x= ~(x - 1);putchar('-');}if (x > 9)write(x / 10);putchar(x % 10 + '0'); } void rd_test() { #ifdef LOCALstartTime= clock();freopen("in.txt", "r", stdin); #endif } void Time_test() { #ifdef LOCALendTime= clock();printf("\nRun Time:%lfs\n", (double)(endTime - startTime) / CLOCKS_PER_SEC); #endif } ll mul(ll a, ll b, ll mod) {ll ans= 0;while (b) {if (b & 1)ans= (ans + a) % mod;a= (a + a) % mod;b>>= 1;}return ans; } ll poww(ll a, ll b, ll mod) {ll ans= 1;while (b) {if (b & 1)ans= mul(ans, a, mod) % mod;a= mul(a, a, mod) % mod;b>>= 1;}return ans % mod; } ll phi(ll n) {ll ans= n;for (int i= 2; i <= sqrt(n); i++) {if (n % i == 0) {ans= ans / i * 1ll * (i - 1);while (n % i == 0)n/= i;}}if (n > 1)ans= ans / n * 1ll * (n - 1);return ans; } int main() {//rd_test();ll l;int cas= 0;while (cin >> l) {if (l == 0)break;ll mod= l / __gcd(8ll, l) * 9ll;ll p= phi(mod);ll ret= 1e18;for (ll x= 1; x <= sqrt(p); x++) {if (p % x != 0)continue;if (poww(10, x, mod) == 1)ret= min(ret, x);if (poww(10, p / x, mod) == 1)ret= min(ret, p / x);}printf("Case %d: ", ++cas);printf("%lld\n", ret == 1e18 ? 0 : ret);}return 0;//Time_test(); } 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的Acwing202. 最幸运的数字的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 驻景丸的功效与作用、禁忌和食用方法
- 下一篇: 白小米的功效与作用、禁忌和食用方法