乘法逆元+快速幂

唉...

 1 #include <iostream>
 2 #include <string.h>
 3 #include <cstdio>
 4 #include <queue>
 5 #include <map>
 6 #include <vector>
 7 #include <string>
 8 #include <cstring>
 9 #include <algorithm>
10 #include <math.h>
11
12 #define SIGMA_SIZE 26
13 #pragma warning ( disable : 4996 )
14
15 using namespace std;
16 typedef long long LL;
17
18 inline LL LMax(LL a,LL b)    { return a>b?a:b; }
19 inline LL LMin(LL a,LL b)    { return a>b?b:a; }
20 inline int Max(int a,int b) { return a>b?a:b; }
21 inline int Min(int a,int b) { return a>b?b:a; }
22 inline int gcd( int a, int b ) { return b==0?a:gcd(b,a%b); }
23 inline int lcm( int a, int b ) { return a/gcd(a,b)*b; }  //a*b = gcd*lcm
24 const LL INF = 0x3f3f3f3f3f3f3f3f;
25 const LL mod  = 1000000007;
26 const int inf  = 0x3f3f3f3f;
27 const int maxk = 1e5+5;
28 const int maxn = 1e5+5;
29
30 int K;
31 char str[maxn];
32
33 //计算a的b次方取模
34 LL getm( LL a, LL b, LL m )
35 {
36     LL ans = 1, base = a;
37     while( b )
38     {
39         if ( b & 1 )
40             ans = (ans * base) % m;
41         base = ( base * base ) % m;
42         b >>= 1;
43     }
44     return ans;
45 }
46
47 // 求a关于p的逆元
48 LL getn( LL a, LL p )
49 { return getm( a, p-2, p ); }
50
51 int main()
52 {
53     cin >> K;
54     scanf( "%s", str );
55
56     LL ans = 0;
57     int len = strlen(str);
58
59     LL inv, a1 = 0;
60     LL p = 1, tmp = getm( 2, len, mod );
61     LL sum = 0;
62
63
64
65     p = getm( tmp, K, mod );
66     inv = getn( tmp-1, mod );
67     sum = ( ((p-1)%mod) * (inv%mod) ) %mod;
68
69     for (int i = len - 1; i >= 0; i--)
70     {
71         if (str[i] == ‘0‘ || str[i] == ‘5‘)
72         {
73             a1 = getm( 2, i, mod );
74             ans += (a1*sum)%mod;
75             ans %= mod;
76         }
77     }
78
79     printf( "%lld\n", ans );
80
81     return 0;
82 }

原文地址:https://www.cnblogs.com/chaoswr/p/8973836.html

时间: 2024-11-09 03:08:13

乘法逆元+快速幂的相关文章

POJ1845 Sumdiv - 乘法逆元+快速幂【A^B的约数个数和】

POJ1845 Sumdiv Sol: 约数个数和\(sumdiv=(1+p_1+p_1^2+\dots + p_1^{c_1})*\dots *(1+p_k+p_k^2+\dots + p_k^{c_k})\) 其中每一项都是一个首项为1,公比为\(p_i\)的等比数列的和,即 \(1*\frac{1-p_i^{c_{k}+1}}{1-p_i}=\frac{p_i^{c_{k}+1}-1}{p_i-1}\) 可以通过快速幂+逆元求解. 然而,当\(9901|(p_i-1)\)时,\(p_i-1

51 Nod 1013 3的幂的和 矩阵链乘法||逆元+快速幂

这道题我写了两种写法 一种利用逆元 a/b%mod=a*c%mod; (c是b的逆元)易得2的逆元就是5~~~04: 一种是矩阵快速幂 利用递推式得出结论 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int mod=1000000007; int read(){ int ans=0,f=1,c=getchar(); while(c<'0'||c&

快速乘法(基于快速幂)

快速乘法的思想和快速幂的思想一样,快速幂是求一个数的高次幂,快速乘法是求两个数相乘,什么时候才用得到快速乘法呢,当两个数相称可能超过long long 范围的时候用,因为在加法运算的时候不会超,而且可以直接取模,这样就会保证数据超不了了.具体拿一个BestCoder的题目来示例.题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5187 这个题先找规律,然后在求快速乘法和快速幂结合起来.题目推出来通式是:2n-2 推的过程就是一共有四种情况: 升升,升

POJ 2447 RSA 大数分解+逆元+快速幂

链接:http://poj.org/problem?id=2447 题意: 思路:Pollard_Rho质数分解,得到两个素数因子,P,Q,求出T,E,快速幂即可得M. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <map> #include <cstdlib> #include <queue>

2014 Super Training #7 F Power of Fibonacci --数学+逆元+快速幂

原题:ZOJ 3774  http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3774 ---------------------------------------------------------------------------------------------------------------------- 这题比较复杂,看这篇比较详细:http://blog.csdn.net/acdreamers/artic

HDU 4965 Fast Matrix Caculation ( 矩阵乘法 + 矩阵快速幂 + 矩阵乘法的结合律 )

HDU 4965 Fast Matrix Calculation ( 矩阵乘法 + 矩阵快速幂 + 矩阵乘法的结合律 ) #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define MAX_SIZE 1001 #define CLR( a, b ) memset( a, b, sizeof(a) ) #define MOD 6 typedef long lo

组合数取模(逆元+快速幂(转)

组合数公式: 我们需要求阶乘和逆元阶乘 我们就用1e9+7来求余吧 费马小定理 a^(p-1) ≡1 (mod p) 两边同除以a a^(p-2) ≡1/a (mod p) 数论1/a 是inv(a) 应该写a^(p-2) ≡ inv(a) (mod p) 所以inv(a) = a^(p-2) (mod p) 这个用快速幂求一下,复杂度O(logn) 引用其他人写的一句话 除法求模不能类似乘法,对于(A/B)mod C,直接(A mod C)/ (B mod C)是错误的:找到B的逆元b(b=B

矩阵乘法、快速幂

1 #include <cstdio> 2 #include <iostream> 3 #include <vector> 4 #include <cstring> 5 using namespace std; 6 // 矩阵的STL实现 7 typedef vector<int> vec; 8 typedef vector<vec> mat; 9 typedef long long ll; 10 const int MOD = 10

ACM学习历程—HDU5490 Simple Matrix (数学 &amp;&amp; 逆元 &amp;&amp; 快速幂) (2015合肥网赛07)

Problem Description As we know, sequence in the form of an=a1+(n−1)d is called arithmetic progression and sequence in the form of bn=b1qn−1(q>1,b1≠0) is called geometric progression. Huazheng wants to use these two simple sequences to generate a simp