看完了题目 让我们来推导一下公式吧!
推完了公式辣,来分析一下复杂度。
O(R(n,i)) = O(R(n-1,i-1)) + O(R(n-1,i-2)) + ...
这东西是递归的,递归基是i=0或n=0。
所以,复杂度是O(i^2)的!i的大小最大是100(i的上限是m)。。。听起来这个复杂度还有点合理。
接下来就写代码。
code:
#include <bits/stdc++.h> using namespace std; long long mod = 1e9 + 7; long long b[105]; long long power(long long num,long long k) { num %= mod; long long ans = 1; while(k) { if(k & 1) ans = ans * num % mod; k >>= 1; num = num * num % mod; } return ans; } long long C(int x,int y) { //懒得写复杂度低的了,反正就100 long long ans = 1; for(int i = 0;i < y;++i) { ans = ans * (x-i) % mod; ans = ans * power(i+1,mod-2) % mod; } return ans; } long long a; long long R(long long n,long long k) { if(n == 0) { if(k == 0) return 1; return 0; } if(k == 0) { long long ans = (power(a,n+1)-a+mod)%mod; ans = ans * power(a-1,mod-2) % mod; return ans; } long long ans = (a - power(a,n+1)*power(n,k)%mod + mod ) % mod; for(int i = 0;i <= k-1;++i) { ans = (ans + a * C(k,k-i) % mod * R(n-1,i)) % mod; } ans = mod - ans; ans = ans * power(a-1,mod-2) % mod; return ans; } int main() { long long n,m; cin >> n >> m >> a; long long ans = 0; for(int i = 0;i <= m;++i) { scanf("%lld",&b[i]); ans += b[i] * R(n,i) % mod; ans %= mod; } cout << (ans+b[0])%mod << endl; return 0; }
对了下样例,反正样例都对了,假装自己已经ac
upd:对不起,代码写错了。。。如上图推导,那一堆东西/(1-a)的部分,a如果是1的话会出现除0的错误,并且a==1时等比数列求和公式也是不能用的。
在a=1时应该特殊讨论一下。。。这个坑就留给小朋友们啦!加油!冲鸭!