参考博客: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\n",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\n",ans); 70 }*/ 71 }
总感觉,,数论的题目都好难想到思路啊= =。。