hdu-5478 Can you find it(快速幂)

思路:暴力。

由于(ak1*n+b1+bk2(n-1)+1)(modC)=0对于任意n为正整数恒成立,那么对于n=1成立可得(ak1+b1+b)(modC)=0;n =2时可得(a2*k1+b1+bk2+1)(modC)=0;

那么将n=1时所得的等式*ak1(modC)得(a2*k1+b1+b*ak1)(modC)=0;

那么和n=2时所得的式子比较可得(ak1)(modC)=(bk2)(modC);

那么由于1<=a,b<C;

那么从1循环到C枚举a,用快速幂求ak1,ak1+b1,用n=1时的等式求b,快速幂求bk2 ,判断是否(ak1)(modC)=(bk2)(modC);

下面证明;当a,b符合1,2式时,就(ak1*n+b1+bk2(n-1)+1)(modC)对于任意n为正整数恒成立。

1式可解得b=(C-(ak1+b1)modC);由1,2式得(ak1)(modC)=(bk2)(modC);

那么原式可改写为:(ak1*n+b1+ak1(n-1)*(C-(ak1+b1)modC))(modC)=0;

==(ak1*n+b1+ak1(n-1)*(C-(ak1+b1))(modC)=0

==(C*ak1(n-1))(modC)=0;

得证。

时间复杂度为(n*log(n));

 1 #include<algorithm>
 2 #include<stdlib.h>
 3 #include<iostream>
 4 #include<string.h>
 5 #include<math.h>
 6 #include<stdio.h>
 7 typedef long long ll;
 8 ll quick(ll x,ll y);
 9 ll C;
10 using namespace std;
11 int main(void)
12 {
13     ll i,j,k,p,q;
14     int e=0;
15     while(scanf("%lld %lld %lld %lld",&C,&k,&p,&q)!=EOF)
16     {int flag=0;
17         e++;
18         printf("Case #%d:\n",e);
19         for(i=1;i<C;i++)
20         {
21             ll kk=quick(i,k);//a^k1,
22             ll k2=quick(i,k+p);//a^(k1+b1)
23             ll b=(C-k2);//b
24             ll z=quick(b,q);//b^k2;
25             if(z==kk)
26             {flag=1;
27                 printf("%lld %lld\n",i,b);
28             }
29         }
30         if(flag==0)
31         {
32             printf("-1\n");
33
34         }
35
36     }
37     return 0;
38
39 }
40
41
42 ll quick(ll x,ll y)//快速幂
43 {
44     ll i,j,k;
45     i=1;
46     k=x;
47     while(y)
48     {
49         if(y&1)
50         {
51             i=(i*k)%C;
52         }
53         k=(k*k)%C;
54         y/=2;
55     }
56     return i;
57 }
时间: 2024-12-06 21:45:04

hdu-5478 Can you find it(快速幂)的相关文章

HDU 4896 Minimal Spanning Tree(矩阵快速幂)

题意: 给你一幅这样子生成的图,求最小生成树的边权和. 思路:对于i >= 6的点连回去的5条边,打表知907^53 mod 2333333 = 1,所以x的循环节长度为54,所以9个点为一个循环,接下来的9个点连回去的边都是一样的.预处理出5个点的所有连通状态,总共只有52种,然后对于新增加一个点和前面点的连边状态可以处理出所有状态的转移.然后转移矩阵可以处理出来了,快速幂一下就可以了,对于普通的矩阵乘法是sigma( a(i, k) * b(k, j) ) (1<=k<=N), 现在

HDU - 1588 Gauss Fibonacci (矩阵快速幂+二分求等比数列和)

Description Without expecting, Angel replied quickly.She says: "I'v heard that you'r a very clever boy. So if you wanna me be your GF, you should solve the problem called GF~. " How good an opportunity that Gardon can not give up! The "Prob

hdu 1588 Gauss Fibonacci(矩阵快速幂)

Gauss Fibonacci Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2090    Accepted Submission(s): 903 Problem Description Without expecting, Angel replied quickly.She says: "I'v heard that you'r

hdu 4965 Fast Matrix Calculation(矩阵快速幂)

题目链接:hdu 4965 Fast Matrix Calculation 题目大意:给定两个矩阵A,B,分别为N*K和K*N: 矩阵C = A*B 矩阵M=CN?N 将矩阵M中的所有元素取模6,得到新矩阵M' 计算矩阵M'中所有元素的和 解题思路:因为矩阵C为N*N的矩阵,N最大为1000,就算用快速幂也超时,但是因为C = A*B, 所以CN?N=ABAB-AB=AC′N?N?1B,C' = B*A, 为K*K的矩阵,K最大为6,完全可以接受. #include <cstdio> #inc

HDU 3306 Another kind of Fibonacci(快速幂矩阵)

题目链接 构造矩阵 看的题解,剩下的就是模板了,好久没写过了,注意取余. #include <cstring> #include <cstdio> #include <string> #include <iostream> #include <algorithm> #include <vector> #include <queue> using namespace std; #define MOD 10007 #defin

HDU 2294 Pendant (DP+矩阵快速幂降维)

HDU 2294 Pendant (DP+矩阵快速幂降维) ACM 题目地址:HDU 2294 Pendant 题意: 土豪给妹子做首饰,他有K种珍珠,每种N个,为了炫富,他每种珍珠都要用上.问他能做几种长度[1,N]的首饰. 分析: 1 ≤ N ≤ 1,000,000,000简直可怕. 首先想dp,很明显可以想到: dp[i][j] = (k-(j-1))*dp[i-1][j-1] + j*dp[i-1][j](dp[i][j]表示长度为i的并且有j种珍珠的垂饰有多少个) 然后遇到N太大的话,

HDU 1588 Gauss Fibonacci(矩阵快速幂+二分等比序列求和)

HDU 1588 Gauss Fibonacci(矩阵快速幂+二分等比序列求和) ACM 题目地址:HDU 1588 Gauss Fibonacci 题意: g(i)=k*i+b;i为变量. 给出k,b,n,M,问( f(g(0)) + f(g(1)) + ... + f(g(n)) ) % M的值. 分析: 把斐波那契的矩阵带进去,会发现这个是个等比序列. 推倒: S(g(i)) = F(b) + F(b+k) + F(b+2k) + .... + F(b+nk) // 设 A = {1,1,

hdu 4704 费马小定理+快速幂

题意就是:做整数拆分,答案是2^(n-1) 由费马小定理可得:2^n % p = 2^[ n % (p-1) ]  % p 当n为超大数时,对其每个数位的数分开来加权计算 当n为整型类型时,用快速幂的方法求解 #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> using namespace std; const in

HDU 4965 Fast Matrix Calculation (矩阵快速幂取模----矩阵相乘满足结合律)

http://acm.hdu.edu.cn/showproblem.php?pid=4965 利用相乘的可结合性先算B*A,得到6*6的矩阵,利用矩阵快速幂取模即可水过. 1 #include<iostream> 2 #include<stdio.h> 3 #include<iostream> 4 #include<stdio.h> 5 #define N 1010 6 #define M 1010 7 #define K 6 8 using namespa

[ACM] hdu 3923 Invoker (Poyla计数,快速幂运算,扩展欧几里得或费马小定理)

Invoker Problem Description On of Vance's favourite hero is Invoker, Kael. As many people knows Kael can control the elements and combine them to invoke a powerful skill. Vance like Kael very much so he changes the map to make Kael more powerful. In