• HDU 5793 A Boring Question ——(找规律,快速幂 + 求逆元)


      参考博客:http://www.cnblogs.com/Sunshine-tcf/p/5737627.html

      说实话,官方博客的推导公式看不懂。。。只能按照别人一样打表找规律了。。。但是打表以后其实也不是很好看出规律的。。。而且这个表都写了半天233。。。(真是太弱了= =)为了打表,我们应当先知道k数列必须是不递减的才能满足值不为0,因此我们可以用递归来写这个表(类似于dfs)。

      AC代码如下:

     1 #include <stdio.h>
     2 #include <algorithm>
     3 #include <string.h>
     4 using namespace std;
     5 typedef long long ll;
     6 const int mod = 1000000007;
     7 
     8 int qpow(int a,int b)
     9 {
    10     int ans = 1;
    11     while(b)
    12     {
    13         if(b & 1) ans = 1LL * ans * a % mod;
    14         b >>= 1;
    15         a = 1LL * a * a % mod;
    16     }
    17     return ans;
    18 }
    19 
    20 int inv(int p)
    21 {
    22     return qpow(p,mod-2);
    23 }
    24 
    25 int main()
    26 {
    27     int T;scanf("%d",&T);
    28     while(T--)
    29     {
    30         int n,m;scanf("%d%d",&n,&m);
    31         int ans = qpow(m,n+1);
    32         ans = ((ans - 1) % mod + mod) % mod;
    33         ans = 1LL * ans * inv(m-1) % mod;
    34         printf("%d
    ",ans);
    35     }
    36 }

      打表代码如下:

     1 #include <stdio.h>
     2 #include <algorithm>
     3 #include <string.h>
     4 using namespace std;
     5 
     6 int c[15][15];
     7 //int n,m;
     8 
     9 void init()
    10 {
    11     c[0][0] = c[1][0] = c[1][1] = 1;
    12     for(int i=2;i<=10;i++)
    13     {
    14         c[i][0] = c[i][i] = 1;
    15         for(int j=1;j<i;j++)
    16         {
    17             c[i][j] = c[i-1][j-1] + c[i-1][j];
    18         }
    19     }
    20 }
    21 
    22 int ans = 0,a[15];
    23 void solve(int pos,int now,int n,int m)
    24 {
    25     a[pos] = now;
    26     if(pos == m)
    27     {
    28         int t = 1;
    29         for(int i=2;i<=m;i++) t *= c[a[i]][a[i-1]];
    30         ans += t;
    31         return;
    32     }
    33     for(int i=now;i<=n;i++)
    34     {
    35         solve(pos+1,i,n,m);
    36     }
    37 }
    38 
    39 void getAns(int n,int m)
    40 {
    41     memset(a,0,sizeof(a));
    42     ans = 0;
    43     for(int i=0;i<=n;i++)
    44     {
    45         solve(1,i,n,m);
    46     }
    47 }
    48 
    49 int main()
    50 {
    51     init();
    52     for(int i=1;i<=5;i++)
    53     {
    54         for(int j=1;j<=5;j++)
    55         {
    56             getAns(i,j);
    57             printf("f(%d,%d)=%d  ",i,j,ans);
    58         }
    59         puts("");
    60     }
    61     /*while(scanf("%d%d",&n,&m)==2)
    62     {
    63         memset(a,0,sizeof(a));
    64         ans = 0;
    65         for(int i=0;i<=n;i++)
    66         {
    67             solve(1,i);
    68         }
    69         printf("%d
    ",ans);
    70     }*/
    71 }

      总感觉,,数论的题目都好难想到思路啊= =。。

  • 相关阅读:
    Yahoo 14条 雅虎十四条 优化原则【转】
    从HTML1到HTML5,回首HTML发展历史【转】
    HTML的发展历史【转】
    jquery中prop()方法和attr()方法的区别【转】
    一个文献综述的写法
    ammunition用法
    混了SQL连接就运行这个
    cruel用法
    ball up用法
    episode用法
  • 原文地址:https://www.cnblogs.com/zzyDS/p/5794593.html
Copyright © 2020-2023  润新知