• 快速幂取模模板 && 51nod 1013 3的幂的和


     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cmath>
     4 #include <vector>
     5 #include <cstring>
     6 #include <string>
     7 #include <algorithm>
     8 #include <string>
     9 #include <set>
    10 #include <functional>
    11 #include <numeric>
    12 #include <sstream>
    13 #include <stack>
    14 #include <map>
    15 #include <queue>
    16 #pragma comment(linker, "/STACK:102400000,102400000")
    17 #define CL(arr, val)    memset(arr, val, sizeof(arr))
    18 
    19 #define ll long long
    20 #define inf 0x7f7f7f7f
    21 #define lc l,m,rt<<1
    22 #define rc m + 1,r,rt<<1|1
    23 #define pi acos(-1.0)
    24 
    25 #define L(x)    (x) << 1
    26 #define R(x)    (x) << 1 | 1
    27 #define MID(l, r)   (l + r) >> 1
    28 #define Min(x, y)   (x) < (y) ? (x) : (y)
    29 #define Max(x, y)   (x) < (y) ? (y) : (x)
    30 #define lson l,m,rt<<1
    31 #define rson m+1,r,rt<<1|1
    32 #define E(x)        (1 << (x))
    33 #define iabs(x)     (x) < 0 ? -(x) : (x)
    34 #define OUT(x)  printf("%I64d
    ", x)
    35 #define lowbit(x)   (x)&(-x)
    36 #define Read()  freopen("a.txt", "r", stdin)
    37 #define Write() freopen("b.txt", "w", stdout);
    38 #define maxn 100010
    39 #define mod 1000000007
    40 using namespace std;
    41 
    42 ll quick_mod(ll a,ll b,ll c)
    43 {
    44     ll ans=1;
    45     while(b)
    46     {
    47         if(b&1)
    48         {
    49             ans=(ans*a)%c;
    50             b--;
    51         }
    52         b/=2;
    53         a=(a*a)%c;
    54     }
    55     return ans;
    56 }
    57 int main()
    58 {
    59    // freopen("a.txt","r",stdin);
    60     ll a,b,c;
    61     scanf("%lld%lld%lld",&a,&b,&c);
    62     printf("%lld
    ",quick_mod(a,b,c));
    63     return 0;
    64 }

     http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1013

     这个题需要用到两次二分:第一次是在求3^n次方,第二次是求3^0+3^1+...3^n.

    第一次二分就是上面的快速幂,第二次二分:

    加入n=5       3^1+3^2+3^3+3^4+3^5 = 3^1+3^2 + 3^2*(3^1+3^2) +3^5  

    这样就可以递归求解了,跟矩阵快速幂类似。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cmath>
     4 #include <vector>
     5 #include <cstring>
     6 #include <string>
     7 #include <algorithm>
     8 #include <string>
     9 #include <set>
    10 #include <functional>
    11 #include <numeric>
    12 #include <sstream>
    13 #include <stack>
    14 #include <map>
    15 #include <queue>
    16 #pragma comment(linker, "/STACK:102400000,102400000")
    17 #define CL(arr, val)    memset(arr, val, sizeof(arr))
    18 
    19 #define ll long long
    20 #define inf 0x7f7f7f7f
    21 #define lc l,m,rt<<1
    22 #define rc m + 1,r,rt<<1|1
    23 #define pi acos(-1.0)
    24 
    25 #define L(x)    (x) << 1
    26 #define R(x)    (x) << 1 | 1
    27 #define MID(l, r)   (l + r) >> 1
    28 #define Min(x, y)   (x) < (y) ? (x) : (y)
    29 #define Max(x, y)   (x) < (y) ? (y) : (x)
    30 #define lson l,m,rt<<1
    31 #define rson m+1,r,rt<<1|1
    32 #define E(x)        (1 << (x))
    33 #define iabs(x)     (x) < 0 ? -(x) : (x)
    34 #define OUT(x)  printf("%I64d
    ", x)
    35 #define lowbit(x)   (x)&(-x)
    36 #define Read()  freopen("a.txt", "r", stdin)
    37 #define Write() freopen("b.txt", "w", stdout);
    38 #define maxn 100010
    39 #define mod 1000000007
    40 using namespace std;
    41 
    42 ll power(ll a,ll b)
    43 {
    44     ll ans=1;
    45     while(b)
    46     {
    47         if(b&1)
    48         {
    49             ans=(ans*a)%mod;
    50             b--;
    51         }
    52         b/=2;
    53         a=(a*a)%mod;
    54     }
    55     return ans;
    56 }
    57 ll c;
    58 ll sum(ll a,ll k)
    59 {
    60     if(k == 1) return a;  
    61     c=sum(a,k>>1);
    62     ll ans=(c+c*power(a,(k>>1)))%mod;  //每次 计算出两项 
    63     if(k&1) ans=(ans+power(a,k))%mod;  //是奇数的话要加上最后那一项
    64     return ans;
    65 }
    66 int main()
    67 {
    68    //freopen("a.txt","r",stdin);
    69     ll n;
    70     scanf("%lld",&n);
    71     //printf("%lld
    ",(power(3,20)-1)/2%mod);
    72     printf("%lld
    ",((sum(3,n)%mod))+1);
    73     return 0;
    74 }
  • 相关阅读:
    [moblie]safari 关闭上下文菜单和选区菜单
    [javascript] <完全开源,开心分享> HTML5 Canvas 在线图片处理《imageMagic》(single page app)开发详解[1]
    [nodejs]q&a
    [tool]webstorm 用firewatcher编译less
    前端截长屏功能
    切换路由默认回到顶部功能
    echarts 词云图和Map图兼容
    针对笔记本电脑系统默认缩放为150%导致页面放大解决方案
    关于专利的写作注意的要点(待续)
    Quartus中引脚的添加
  • 原文地址:https://www.cnblogs.com/nowandforever/p/4581900.html
Copyright © 2020-2023  润新知