洛谷 P4884 多少个1?

   题面在这里

 

 

 

    好久没做题了2333,竟然还一次A了,神奇

 

    大概就是等比数列然后把分母乘过去,然后直接BSGS就行了,就是要写快速乘恩。。。

 

#include<bits/stdc++.h>
#define ll long long
using namespace std;

inline ll add(ll x,ll y,const ll ha){ x+=y; return x>=ha?x-ha:x;}
inline void ADD(ll &x,ll y,const ll ha){ x+=y; if(x>=ha) x-=ha;}

inline ll ksc(ll x,ll y,const ll ha){
	ll an=0;
	for(;y;y>>=1,ADD(x,x,ha)) if(y&1) ADD(an,x,ha);
	return an;
}

inline ll ksm(ll x,ll y,const ll ha){
	ll an=1;
	for(;y;y>>=1,x=ksc(x,x,ha)) if(y&1) an=ksc(an,x,ha);
	return an;
}

ll M,K,sz,now;
unordered_map<ll,ll> mmp;

inline ll solve(){
	sz=sqrt(M+0.5)+1,now=1;
	for(int i=0;i<sz;i++,now=ksc(now,10,M)) if(!mmp.count(now)) mmp[now]=i;
	
	now=ksm(now,M-2,M);
	for(int i=0;i<sz;i++,K=ksc(K,now,M)) if(mmp.count(K)) return i*sz+mmp[K];
	
	return 2333;
}

int main(){
	scanf("%lld%lld",&K,&M),K=(K*9ll+1)%M;
	printf("%lld\n",solve());
	return 0;
}

  

posted @ 2018-09-24 20:50  蒟蒻JHY  阅读(173)  评论(0编辑  收藏  举报