P4884 多少个一

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')是方程一组解

原文地址:https://www.cnblogs.com/shikeyu/p/13380718.html