| Task: | Kaaleppi's puzzle |
| Sender: | Ace of Spades |
| Submission time: | 2016-05-28 14:14:36 +0300 |
| Language: | C++ |
| Status: | READY |
| Result: | ACCEPTED |
| test | verdict | time | |
|---|---|---|---|
| #1 | ACCEPTED | 0.06 s | details |
| #2 | ACCEPTED | 0.06 s | details |
| #3 | ACCEPTED | 0.07 s | details |
Code
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MN = 1111;
const int MOD = 1e9+7;
int ans[MN];
ll dp[3][MN][2]; //e, v
int main(void) {
cin.tie(0);
ios_base::sync_with_stdio(false);
cout << fixed << setprecision(12);
dp[1][0][0] = 1;
ans[1] = 1;
for(int i = 2; i <= 1111; ++i) {
for(int j = 0; j < i; ++j) {
dp[2][j+1][1] += 2*dp[1][j][0];
dp[2][j+1][1] %= MOD;
if(j > 0) {
dp[2][j-1][0] += dp[1][j][0]*j;
dp[2][j-1][0] %= MOD;
}
int q = i-2-j;
dp[2][j][0] += q*dp[1][j][0];
dp[2][j][0] %= MOD;
if(j > 0) {
dp[2][j][1] += dp[1][j][1];
dp[2][j][1] %= MOD;
int w = i-1-j;
dp[2][j][0] += dp[1][j][1]*w;
dp[2][j][0] %= MOD;
dp[2][j+1][1] += dp[1][j][1];
dp[2][j+1][1] %= MOD;
dp[2][j-1][0] += dp[1][j][1] * (j-1);
dp[2][j-1][0] %= MOD;
}
}
for(int j = 0; j < MN; ++j) {
for(int k = 0; k < 2; ++k) {
dp[1][j][k] = dp[2][j][k];
dp[2][j][k] = 0;
}
}
ans[i] = dp[1][0][0];
}
int tt;
cin>>tt;
for(int i = 0; i < tt; ++i) {
int q;
cin>>q;
cout<<ans[q]<<'\n';
}
}
Test details
Test 1
Verdict: ACCEPTED
| input |
|---|
| 20 1 2 3 4 ... |
| correct output |
|---|
| 1 0 0 2 14 ... |
| user output |
|---|
| 1 0 0 2 14 ... |
Test 2
Verdict: ACCEPTED
| input |
|---|
| 20 981 982 983 984 ... |
| correct output |
|---|
| 436438246 92806357 21003215 151460560 326076265 ... |
| user output |
|---|
| 436438246 92806357 21003215 151460560 326076265 ... |
Test 3
Verdict: ACCEPTED
| input |
|---|
| 20 352 478 99 92 ... |
| correct output |
|---|
| 552481822 246955132 94569313 829032275 94621650 ... |
| user output |
|---|
| 552481822 246955132 94569313 829032275 94621650 ... |
