多少个1?
多少个1?
solution:
考虑函数f(x)=10x+1
原问题就转化为求最小正整数n使得f(x)的n次迭代在模m的意义下与k同余
通过打表找规律可得f(x)的n次迭代为\(\frac{10^n-1}{9}\)
然后又因为m是素数
那么这道题就是bsgs裸题了
points for attention:
打完这道题才发现我bsgs的模板一直都是假的
code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll k,m;
map<ll,ll>mp;
inline ll mul(ll x,ll y)
{
ll ans=0;
while(y)
{
if(y&1)(ans+=x)%=m;
(x+=x)%=m,y>>=1;
}
return ans;
}
inline ll qpow(ll x,ll y)
{
ll ans=1;
for(;y;y>>=1,x=mul(x,x))
if(y&1)ans=mul(ans,x);
return ans;
}
inline void bsgs()
{
ll x=k,n=sqrt(m+0.5)+1;//就是这里。一定要加1啊啊啊
for(int i=0;i<n;++i,x=mul(10ll,x))mp[x]=1ll*i;
ll g=qpow(10ll,n);x=g;
for(int i=1;i<=n;++i,x=mul(x,g))
if(mp.count(x)){printf("%lld\n",1ll*i*n-mp[x]);break;}
}
int main()
{
scanf("%lld%lld",&k,&m);
k=(k*9ll+1ll)%m;
bsgs();
return 0;
}
NO PAIN NO GAIN