P4884-多少个1?【BSGS】

1|0正题

题目链接:https://www.luogu.com.cn/problem/P4884


1|1题目大意

求一个最小的n使得n个连续的1其在模m意义下等于k

6m1011,0<k<m


1|2解题思路

补一道老题

n个连续的1就是10n19所以题目是求

10n19k(mod m)

10n9k+1(mod m)

然后BSGS就好了

要开\_\_int128


1|3code

#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"); }

__EOF__

本文作者QuantAsk
本文链接https://www.cnblogs.com/QuantAsk/p/14622914.html
关于博主:退役OIer,GD划水选手
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   QuantAsk  阅读(51)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示