多少个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;
}
posted @ 2020-09-29 19:17  BILL666  阅读(167)  评论(0编辑  收藏  举报