去图书馆借书,找到数论那一架子,空了一大片了,看了半天没找到想找的,跳来跳去,找了两本组合数学先凑合着,不大沾边,等大佬们看完,找他们借一下吧。
陷入大素数判定无法自拔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(1≤C≤2×105)
, and three integers k1, b1, k2
(1≤k1,k2,b1≤109)
. Please find all pairs (a, b) which satisfied the equation
ak1⋅n+b1
+
bk2⋅n−k2+1
= 0 (mod C)(n = 1, 2, 3, ...).
Please output all pairs (a, b) in lexicographical order. (1≤a,b<C) . If there is not a pair (a, b), please output -1.
23 1 1 2
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;
}