P4884 多少个1?
(11....1(N个1)equiv K(mod~m))
由等比数列易知(10^n+10^{n-1}+...+10^0=frac{(1-10^n)}{1-10}=frac{10^n-1}{9})
[frac{10^n-1}{9}equiv k(mod~m)\
10^n-1equiv9k~(mod~m)\
10^nequiv9k+1(mod~m)
]
#include<cstdio>
#include<map>
#include<cmath>
#define ll long long
using namespace std;
inline ll read() {
ll X=0,w=1; char c=getchar();
while (c<'0'||c>'9') { if (c=='-') w=-1; c=getchar(); }
while (c>='0'&&c<='9') X=(X<<3)+(X<<1)+c-'0',c=getchar();
return X*w;
}
ll mul(ll a,ll b,ll p){
ll ans = 0;
for(;b;b>>=1){
if(b & 1) ans = (ans + a) % p;
a = (a<<1) % p;
}
return ans;
}
ll bsgs(ll a,ll b,ll m){
map<ll,int> mp;
int p = ceil(sqrt(m));
ll num = 1;
mp[1] = 0;
for(int i=1;i<=p;i++) num = mul(num,a,m),mp[mul(num,b,m)] = i;
ll n = 1;
for(int i = 1;i <= p;i++){
n = mul(n,num,m);
if (mp.find(n) != mp.end()) return 1ll * p * i - mp[n];
}
return -1;
}
int main(){
ll k, m;
k = read(); m =read();
printf("%lld",bsgs(10,9*k+1,m));
return 0;
}
(a和b不全为0,存在整数x和y,使得ax+by=gcd(a,b),x=1,y=0即是)
扩欧应用:
1.求解不定方程(ax+by=c)
(c|gcd(a,b))时方程有解,反之无解,令(g=gcd(a,b),a'=a/g,b'=b/g,c'=c/g)
可以(exgcd求出a'x'+b'y'=1的整数解)
(a'c'x'+b'c'y'=c') (a'gc'x'+b'gc'y'=c'g),即(ac'x'+bc'y'=c),所以(x_0=c'x',y_0=c'y')是方程一组解