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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

P4884-多少个1?【BSGS】

發布時間:2023/12/3 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P4884-多少个1?【BSGS】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

正題

題目鏈接:https://www.luogu.com.cn/problem/P4884


題目大意

求一個最小的nnn使得nnn個連續的111其在模mmm意義下等于kkk。

6≤m≤1011,0<k<m6\leq m\leq 10^{11},0<k<m6m1011,0<k<m


解題思路

補一道老題

nnn個連續的111就是10n?19\frac{10^n-1}{9}910n?1?所以題目是求
10n?19≡k(modm)\frac{10^n-1}{9}\equiv k(mod\ m)910n?1?k(mod?m)
?10n≡9k+1(modm)\Rightarrow 10^n\equiv 9k+1(mod\ m)?10n9k+1(mod?m)
然后BSGS\text{BSGS}BSGS就好了

要開__int128\text{\_\_int128}__int128


code

#include<cstdio> #include<cmath> #include<map> #include<cctype> #define ll __int128 using namespace std; ll read(){ll x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-')f=-f;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f; } void print(ll x) {if(x>9)print(x/10);putchar(48+x%10);return;} ll k,m,a; map<ll,ll> hash; int main() {k=read();m=read();k=(k*9+1)%m;ll q=(ll)sqrt((double)m)+1;ll val=1;for(ll j=0;j<q;j++){hash[val*k%m]=j;val=val*10%m;}a=val%m;if(!a) {printf("%d",(m==0)?1:-1);return 0;}val=1;for(ll i=0;i<=q;i++){ll j=hash.find(val)==hash.end()?-1:hash[val];if(j>=0&&i*q-j>=0) {print(i*q-j);return 0;}val=val*a%m;}printf("-1"); }

總結

以上是生活随笔為你收集整理的P4884-多少个1?【BSGS】的全部內容,希望文章能夠幫你解決所遇到的問題。

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