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

  • 相关阅读:
    uniapp中的跳转传参
    图解排序算法(三)之堆排序
    serverlesss
    kvm
    用户态和内核态的理解和区别
    MySQL优化十大技巧
    不懂数据库索引的底层原理?那是因为你心里没点b树
    让你的 Linux 命令骚起来
    史上最简约的vi教程
    mysql 四种隔离级别
  • 原文地址:https://www.cnblogs.com/shikeyu/p/13380718.html
Copyright © 2020-2023  润新知