HDU5478 Can you find it

来源:互联网 发布:喀秋莎视频编辑软件 编辑:程序博客网 时间:2024/05/01 06:15

题目链接

题意:给定 C,k1, b1, k2 找出所有的(a, b)满足 ak1n+b1bk2nk2+1 = 0 (mod C)(n = 1, 2, 3, ...)  (1<=a, b <C)

思路:n = 1时,找出(1,C)范围内的满足的(a, b)组合,然后暴力枚举n,把符合的留下

代码如下:


(1a,b<C)

#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>#include <string>using namespace std;typedef __int64 ll;const int N = 1e5+10;ll C, k1, b1, k2;ll a[2*N], b[2*N];ll pow_mod(ll x, ll y, ll k){ll s = 1;while(y){if (y % 2)s = (s * x)%k;x = (x * x)%k;y >>= 1;}return s;}int main(){  int cas = 1;while(~scanf("%I64d%I64d%I64d%I64d", &C, &k1, &b1, &k2)){printf("Case #%d:\n", cas++);for(ll i = 1; i < C; i++){ll cnt = pow_mod(i, k1 + b1, C);a[i] = i;b[i] = (cnt / C + 1) * C - cnt;}bool flag; ll ans = 0;for(ll i = 1; i < C; i++){flag = 0;for(ll j = 2; j <= 100; j++){if((pow_mod(a[i], k1 * j + b1, C) + pow_mod(b[i], k2 * (j-1) + 1, C)) % C){    flag = 1;break;}}if(!flag){ans++; printf("%I64d %I64d\n", a[i], b[i]);}}if(ans == 0) printf("-1\n");}return 0;}


0 0
原创粉丝点击