HDU5478(快速幂)

Can you find it

Time Limit: 8000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1407    Accepted Submission(s): 581


Problem Description
Given a prime number C(1C2×105), and three integers k1, b1, k2 (1k1,k2,b1109). Please find all pairs (a, b) which satisfied the equation ak1n+b1bk2nk2+1 = 0 (mod C)(n = 1, 2, 3, ...).
 

 

Input
There are multiple test cases (no more than 30). For each test, a single line contains four integers C, k1, b1, k2.
 

 

Output
First, please output "Case #k: ", k is the number of test case. See sample output for more detail.
Please output all pairs (a, b) in lexicographical order. (1a,b<C). If there is not a pair (a, b), please output -1.
 

 

Sample Input
23 1 1 2
 

 

Sample Output
Case #1: 1 22
 
思路:枚举a。当n=1时,ak1+b+b=0(mod C),则b=C-ak1+b(mod C)。再利用n=2,验证b是否正确。
#include <cstdio>
using namespace std;
typedef long long LL;
LL C,k1,b1,k2;
LL npow(LL x,LL n,LL mod)
{
    LL res=1;
    while(n>0)    
    {
        if(n&1)    res=(res*x)%mod;
        x=(x*x)%mod;
        n>>=1;
    }
    return res;
}
int main()
{
    int cas=0;
    while(scanf("%lld%lld%lld%lld",&C,&k1,&b1,&k2)!=EOF)
    {
        bool tag=false;
        printf("Case #%d:\n",++cas);
        for(LL a=1;a<C;a++)
        {
            LL b=C-npow(a,k1+b1,C);
            LL x=npow(a,2*k1+b1,C);
            LL y=npow(b,k2+1,C);
            if((x+y)%C==0)
            {
                tag=true;
                printf("%lld %lld\n",a,b);
            }    
        }
        if(!tag)
        {
            printf("-1\n");
        }
    }
    return 0;
}

 

posted on 2016-08-28 08:37  vCoders  阅读(149)  评论(0编辑  收藏  举报

导航