周中训练笔记+HDU5478Can you find it【快速幂】

去图书馆借书,找到数论那一架子,空了一大片了,看了半天没找到想找的,跳来跳去,找了两本组合数学先凑合着,不大沾边,等大佬们看完,找他们借一下吧。

陷入大素数判定无法自拔ing

即将断电,简写,下面这个题题意:给你一个c,k1,b1,k2求满足下面式子的a,b

思路:这个题目我在网上看了几波解释,都是草草的一句只需要判断n-1

和n=2时候就行了,没什么解释,这几天脑子不是很灵活,想了很久为什么

要想等式成立,首先n=1时得成立。 b=c-ppow(a,k1+b1,c);.

对于,每个n成立,则n+1时,式子只是前半项成上ppow(a,k1,c),后半项ppow(b,k2,c),要想原式子仍然成立,

则必须满足ppow(a,k1,c)==ppow(b,k2,c),细想便可明白,只有乘上的系数相同才可能出现modc还是0

所以直接暴力解决该题

还有就是验证n=1和n=2时成立则成立的,思想就这样,重点是怎么来的,其实和我方才说的一模一样,每次只不过是

前半项成上ppow(a,k1,c),后半项ppow(b,k2,c)

如果n=2成立,后面再怎么乘也还是成立啊

同样是暴力枚举a 的值只是judge等式成立的方式不一样

Can you find it

 


Given a prime number  C(1C2×105) C(1≤C≤2×105), and three integers k1, b1, k2  (1k1,k2,b1109) (1≤k1,k2,b1≤109). Please find all pairs (a, b) which satisfied the equation  ak1n+b1 ak1⋅n+b1 +  bk2nk2+1 bk2⋅n−k2+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) (1≤a,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
#include<iostream>
#include<stdio.h>
#include<string.h>
#define ll long long
using namespace std;
ll ppow(ll a,ll b,ll mod)
{
    ll ans=1;
    ll base=a;
    while(b!=0)
    {
        if(b&1!=0)
            ans=ans*base%mod;
        base=base*base%mod;
        b>>=1;
    }
    return ans;
}
int main()
{
    int cas=1;
    int c,k1,b1,k2;
    while(scanf("%d%d%d%d",&c,&k1,&b1,&k2)!=EOF)
    {
        int flag=0;
        printf("Case #%d:\n",cas++);
        for(ll a=1;a<c;a++)
        {
            ll b=c-ppow(a,k1+b1,c);
            if(ppow(a,k1,c)==ppow(b,k2,c))
            {
                printf("%lld %lld\n",a,b);
                flag=1;
            }
        }
        if(flag==0)
            printf("-1\n");
    }
    return 0;
}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值