栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

poj 3243 Clever Y

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

poj 3243 Clever Y

#include <stdio.h>#include <math.h>#include <algorithm>using namespace std;typedef long long INT;#define MAX (1000000)INT nData[MAX];INT nKey[MAX];INT HashPos(INT key){    return ((unsigned)(key ^ 0xA5A5A5A5)) % MAX;}void HashAdd(INT key, INT data){    INT nPos = HashPos(key);    while (nData[nPos] != -1)    {        nPos = (nPos + 1) % MAX;    }    nData[nPos] = data;    nKey[nPos] = key;}INT HashQuery(INT key){    INT nPos = HashPos(key);    while (nData[nPos] != -1)    {        if (nKey[nPos] == key)        { return nData[nPos];        }        nPos = (nPos + 1) % MAX;    }    return -1;}INT MultMod(INT nA, INT nB, INT nC){    INT nAns = 0;    while (nB)    {        if (nB & 1)        { nAns = (nAns + nA) % nC;        }        nA = (2 * nA) % nC;        nB >>= 1;    }    return nAns;}INT PowerMod(INT nA, INT nX, INT nC){    INT nAns = 1;    nA %= nC;    while (nX)    {        if (nX & 1)        { nAns = MultMod(nAns, nA, nC);         }        nA = MultMod(nA, nA, nC);        nX >>= 1;    }    return nAns;}INT gcd(INT nA, INT nB){    if (nA < nB)swap(nA, nB);    while (nB)    {        INT nT = nA;        nA = nB;        nB = nT % nB;    }    return nA;}INT egcd(INT nA, INT nB, INT& nX, INT& nY){    if (nA < nB)swap(nA, nB);    if (nB == 0)    {        nX = 1;        nY = 0;        return nA;    }    INT nRet = egcd(nB, nA % nB, nX, nY);    INT nT = nX;    nX = nY;    nY = nT - (nA / nB) * nY;    return nRet;}INT GetAns(INT nA, INT nB, INT nC){    if (nC == 0)return -1;    INT nTemp = 1;    nB %= nC;    for (INT i = 0; i <= 50; ++i)    {        if (nTemp == nB)        { return i;        }        nTemp = MultMod(nTemp, nA, nC);    }    INT d;    INT nD = 1;//nD最后是A^k次,k是nC中因子d的次数    INT k = 0;    while ((d = gcd(nC, nA)) != 1)    {        k++;        nC /= d;        if (nB % d)return -1;        nB /= d;        nD = MultMod(nD, nA / d, nC);    }    memset(nKey, -1, sizeof(nKey));    memset(nData, -1, sizeof(nData));    INT nM = ceil(sqrt(1.0 * nC));    nTemp = 1;    for (INT j = 0; j <= nM; ++j)    {        HashAdd(nTemp, j);        nTemp = MultMod(nTemp, nA, nC);    }    INT nK = PowerMod(nA, nM, nC);    for (int i = 0; i <= nM; ++i)    {        INT x, y;        egcd(nC, nD, x, y);        y = (y + nC) % nC;        INT nR = MultMod(y, nB, nC);        int j = HashQuery(nR);        if (j != -1)        { return nM * i + j + k;        }        nD = MultMod(nD, nK, nC);    }    return -1;}int main(){    INT nA, nB, nC;    while (scanf("%I64d%I64d%I64d", &nA, &nC, &nB), nA + nB + nC)    {        INT nAns = GetAns(nA, nB, nC);        if (nAns == -1)        { printf("No Solutionn");        }        else        { printf("%I64dn", nAns);        }    }    return 0;}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/373497.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号