根據打表可得,對於n的情況

任意一個首位!=1的排列時,則其答案-1可以與首位為1的情況對應

當n=4時

排列 答案

1 2 3 4 ------ 0

1 2 4 3 ------ 1

1 3 2 4 ------ 1

1 3 4 2 ------ 2

1 4 2 3 ------ 2

1 4 3 2 ------ 1

2 1 3 4 ------ 1

2 1 4 3 ------ 2

2 3 1 4 ------ 2

2 3 4 1 ------ 3

2 4 1 3 ------ 3

2 4 3 1 ------ 2

3 1 2 4 ------ 2

3 1 4 2 ------ 3

3 2 1 4 ------ 1

3 2 4 1 ------ 2

3 4 1 2 ------ 2

3 4 2 1 ------ 3

4 1 2 3 ------ 3

4 1 3 2 ------ 2

4 2 1 3 ------ 2

4 2 3 1 ------ 1

4 3 1 2 ------ 3

4 3 2 1 ------ 2

記f[i]表示i個數,所有i個數可以組成的排列的答案總和

則我們發現,有(n-1)(n-1)!項首位不等於1的排列,對答案有1的貢獻

除此之外,我們會發現,首項為1的數由於有n個數(包括自己)與其對應

所以對答案有n
f[i-1]的貢獻

所以f[i]=if[i-1]+(i-1)(i-1)!

注意要逆元

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define mo 998244353ll
ll t,f[10000010],n,jc[10000010];
ll qp(ll x,ll y){
	ll r=1;
	x%=mo;
	while(y){
		if(y&1)r=r*x%mo;
		y>>=1;
		x=(x*x)%mo;
	}
	return r;
}
int main(){
	freopen("inverse.in","r",stdin);
	freopen("inverse.out","w",stdout);
	jc[0]=1;
	for(ll i=1;i<=10000010;i++)
		jc[i]=jc[i-1ll]*i%mo;
	for(ll i=1;i<=10000010;i++)
		f[i]=(i*f[i-1ll]%mo+(i-1ll)*jc[i-1ll]%mo)%mo;
	scanf("%lld",&t);
	while(t--){
		scanf("%lld",&n);
		printf("%lld\n",f[n]*qp(jc[n],mo-2ll)%mo);
	}
}

jzoj5931的更多相关文章

随机推荐

  1. Apache虚拟主机/端口多开

    Apache就是强大啊,简单配置一下就可以再开启另一个端口的web服务. 笔者最近使用XAMPP架设php服务端.有一些特别的需求:同样的代码,需要开始不同的端口, 协议类型提供web服务给客户端(h ...

  2. cron,at的权限控制

      /etc/cron.deny存在 /etc/cron.deny不存在 /etc/cron.allow存在 只有/etc/cron.allow中列出的用户才能运行crontab -e:忽略/etc/ ...

  3. POJ1180 Batch Scheduling -斜率优化DP

    题解 将费用提前计算可以得到状态转移方程: $F_i = \min(F_j + sumT_i * (sumC_i - sumC_j) + S \times (sumC_N - sumC_j)$ 把方程 ...

  4. AJAX 请求中多出了一次 OPTIONS 请求 导致 Laravel 中间件无法对 Header 传入的 Token 无法获取

    背景知识: 我们会发现,在很多post,put,delete等请求之前,会有一次options请求.本文主要是来讨论一下这是什么原因引起的. 根本原因就是,W3C规范这样要求了!在跨域请求中,分为简单 ...

  5. extjs 学习一

    环境 : eclipse  ext  tomcat 6 将下载的extjs  解压后全部 导入到项目中 .使用时 <!-- 1.引入样式 2.引入库文件 ,底层驱动 3. ext-all--&g ...

  6. 13.8.8 div块 居中

    <div style="border:1px solid blue;width:760px; height:410px; position:absolute; left:50%; to ...

  7. 创建一个子进程---vfork

    子.父进程共享数据段与堆栈段 函数原型:pid_t vfork(void) 返回值:子进程中返回0,父进程中返回子进程ID,出错返回-1. 注意: vfork创建的进程是按先子进程后父进程的顺序执行的 ...

  8. 2018.10.19 NOIP训练 游戏问题(分组背包)

    传送门 分组背包经典问题. 令f[i][j]f[i][j]f[i][j]表示前iii组花费为jjj的最优值. g[i][j]g[i][j]g[i][j]表示前iii组,第iii组已经支付了平台费用的最 ...

  9. schwarz( 施瓦兹)不等式证明

    证明 如果: 函数 y=ax^2+2bx+c 对任意x >=0 时 y>=0; 函数图象在全部x轴上方,故二次方程判别式 b^2-4ac<=0;(即方程无实数解) 即(2b)^2&l ...

  10. 安装memcache服务

    d:\tools\memcache\setup\memcached -d install