模板-->单变元模线性方程

如果有相应的OJ题目,欢迎同学们提供相应的链接

相关链接

简单的测试

None

代码模板

/*
 * TIME COMPLEXITY:O(logN)
 * PARAMS:
 *      a   ax+ny=b
 *      b
 *      n
 *
 * d=gcd(a,n),ax+ny=d,==>x.But the x is not minimum positive number.See below.
 * the x satisfy ax==d(mod n).If x larger than n,then x=n+y.Thus a(n+y)==b(mod n)==>ay==b(mod n),do that x%=n.After that
 * (ax+na)%n==b%n is correct.x+=n.   The code:x%=n,x+=n,x%=n.
 *
 * Actually,ax'==b(mod n),and b is times of d.So change x'=x*(b/d).
 * Now ax==b(mod n)[x=x'],but x is not minimum number in this equation.
 * Then a'x=b'(mod n'),a'=a/d,b'=b/d,n'=n/d.According to the second line in comment,x=x%n'==>x=x%(n/d).
 * Similarlly,i times n/d+ans[0].
 * Last %n is another limit.
 */
vector <long long> line_mode_equation(long long a,long long b,long long n){
    long long x,y;
    long long d=extend_gcd(a,n,x,y);
    vector<long long> ans;
    ans.clear();
    if(b%d==0){
        x%=n;x+=n;x%=n;
        ans.push_back((x*(b/d)%(n/d)+n/d)%(n/d));
        for(long long i=1;i<d;i++)
            ans.push_back((ans[0]+i*n/d)%n);
    }
    return ans;
}
posted @ 2016-05-29 20:11  xiaocai888  阅读(240)  评论(0编辑  收藏  举报