有毒的数
题目描述
我们把一个数称为有趣的,当且仅当:
-
它的数字只包含0, 1, 2, 3,且这四个数字都出现过至少一次。
-
所有的0都出现在所有的1之前,而所有的2都出现在所有的3之前。
-
最高位数字不为0。
因此,符合我们定义的最小的有趣的数是2013。除此以外,4位的有趣的数还有两个:2031和2301。
请计算恰好有n位的有趣的数的个数。由于答案可能非常大,只需要输出答案除以1000000007的余数。
输入输出格式
输入格式:输入只有一行,包括恰好一个正整数n (4 ≤ n ≤ 1000)。
输出格式:输出只有一行,包括恰好n 位的整数中有趣的数的个数除以1000000007的余数。
输入输出样例
输入样例#1:
4
输出样例#1:
3
————————————————————————————————————————————————
尝试两种方法。都只得了70分。Why?!
code1
1 #include <iostream> 2 3 using namespace std; 4 5 int main(){ 6 long mod = 1000000007; 7 int n; 8 cin>>n; 9 long long **states = new long long*[n+1]; 10 for(int i =0;i<n+1;i++) 11 states[i]=new long long[6]; 12 for(int i =0;i<6;i++) 13 states[0][i]=0; 14 15 for(int i=1;i<=n;i++) 16 { 17 int j = i-1; 18 states[i][0] = 1; 19 states[i][1] = (states[j][0] + states[j][1] * 2) % mod; 20 states[i][2] = (states[j][0] + states[j][2]) % mod; 21 states[i][3] = (states[j][1] + states[j][3] * 2) % mod; 22 states[i][4] = (states[j][1] + states[j][2] + states[j][4] * 2) % mod; 23 states[i][5] = (states[j][3] + states[j][4] + states[j][5] * 2) % mod; 24 } 25 cout<<states[n][5]<<endl; 26 return 0; 27 }
code2
1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <iostream> 5 #include <algorithm> 6 using namespace std; 7 8 typedef long long LL; 9 const int MOD = 1e9 + 7; 10 int n; 11 LL inv[1010]; 12 13 int main() { 14 cin >> n; 15 inv[1] = 1; 16 for (int i = 2; i < 1000; ++ i) 17 inv[i] = inv[MOD % i] * (MOD - MOD / i) % MOD; 18 LL ans = 0; 19 LL col = n - 1; 20 for (int i = 2; i <= n - 2; ++ i) { 21 col = (col * (n-i) % MOD) * inv[i] % MOD; 22 ans = (ans + (col * (i-1) * (n-i-1) % MOD)) % MOD; 23 } 24 cout << ans << endl; 25 return 0; 26 }
急需一个说法。QWQ