洛谷 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; }
我爱学习,学习使我快乐