题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6595
解题心得:遇事不决就打表,瞎打了几个表出来发现其中有一项有个 ( 1 / 3 ) (1/3) (1/3)的递增关系,然后直接写就过了。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 500;
const ll mod = 998244353;
/*
vector<int> temp[1 << 10];
ll fac[100];
ll calP(vector<int> &v)
{
int ret = 0;
for(int i = (int) v.size() - 1; i >= 1; i--){
for(int j = 0; j < i; j++)
if(v[j] > v[i]) ret++;
}
return ret;
}
int vis[1 << 10];
ll cal(vector<int> v, int d)
{
if(d > 100) return 0;
ll cnt = 0;
if(v.size() == 0) return 0;
cnt = calP(v);
vector<int> temp;
for(int i = 0; i < v.size(); i++){
if(rand() & 1){
temp.push_back(v[i]);
}
}
cnt += cal(temp, d + 1);
return cnt;
}
*/
ll powmod(ll a, ll n)
{
ll ret = 1;
while(n){
if(n & 1) ret = ret * a % mod;
a = a * a % mod;
n >>= 1;
}
return ret;
}
ll a[maxn], b[maxn];
ll sum[maxn], ans[maxn];
int main()
{
// freopen("in", "r", stdin);
/* freopen("out", "w", stdout);
fac[0] = 1;
for(int i = 1; i < 10; i++) fac[i] = fac[i - 1] * i;
srand((time(nullptr)));
double ans = 0;
int n = 6;
vector<int> v;
for(int i = 1; i <= n; i++) v.push_back(i);
do{
// int sz = v.size();
// for(int s = 0; s < (1 << sz); s++){
// temp[s].clear();
// for(int j = 0; j < sz; j++){
// if(s >> j & 1){
// temp[s].push_back(v[j]);
// }
// }
// }
double cur = 0;
int xx = 100;
for(int pp = 0; pp < xx; pp++){
memset(vis, 0, sizeof vis);
ll t = cal(v, 0);
cur += t;
}
cur /= xx;
for(auto it:v){
cout << it << ' ';
}
cout << "****" << cur << endl;
ans += cur;
} while(next_permutation(v.begin(), v.end()));
cout << ans << endl;
cout << ans / fac[n] / n;
*/
for(int i = 1; i < maxn; i++) a[i] = 332748118LL * (i) % mod * (i - 1) % mod;
for(int i = 1; i < maxn; i++) sum[i] = (sum[i - 1] + a[i]) % mod;
for(int i=1;i<=3005;i++){
ans[i] = sum[i] * powmod(i, mod - 2) % mod;
}
int N;
while(scanf("%d", &N) != EOF){
printf("%lld\n", ans[N]);
}
return 0;
}