KummerPlus

来源:互联网 发布:caxa编程快捷键 编辑:程序博客网 时间:2024/06/07 20:39
//return the index of d dividing C(n,m);//d is strictly less than 10201;//n is greater than m;int k = 25;int prime[25] = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97 };int index[25];int Kummer(int n, int m, const int p) {    int up=0, index = 0;    n -= m;    while (n != 0 || m != 0) {        up += (n%p) + (m%p);        if (up >= p) {            up = 1;            index++;        }        else up = 0;        n /= p;        m /= p;    }    return index;}void disintegrate(int d) {    for (int i = 0; i < k; ++i) {        index[i] = Kummer(d, 1, prime[i]);    }}int KummerPlus(int n, int m, int d) {    disintegrate(d);    for (int i = 0; i < k; ++i) {        if (index[i] == 0) {            index[i] = 1 << 30;            continue;        }        for (int j = 0; j < index[i]; ++j)            d /= prime[i];        index[i] = Kummer(n, m, prime[i]) / index[i];    }    int min = 1<<30;    for (int i = 0; i < k; ++i) {        if (index[i] < min)min = index[i];    }    if (d != 1) {        int minn = Kummer(n, m, d);        if (minn < min)min = minn;    }    return min;}