海亮 7.11 模拟赛3

海亮 7.11 模拟赛

大寄特寄

T1 20pts暴力显然 T2也有暴搜的分数 然后就不会了

T2特殊性质没打出来 T3T4暴力都寄力()

#A. 计数练习

法一:

我们考虑设f[i]为答案 那么考虑在i1的基础上新加入一个数

分三种情况 对于Q序列的第一位:

  1. 如果Q序列的第一位为1 那么置换后第一位也是1 只需要满足后续排列即可 计入答案为f[i1]

  2. 如果Q序列的第一位为x 那么在p序列中x位置填上一个1即可满足

    那么这两个位置已经固定了 其余就是f[i2]的排列问题

    为什么不用(i2)!而用f[i2]呢? 因为你更换了这两个值之后 排列后这两个位置和原序列是不变的 其他地方还是需要满足排列的规则

    此时x的位置有i1种 计入答案为f[i2](i1)

  3. Q的第一位不是x 那么必须满足这一位的值小于x 值域为[2,i1] (因为我们值为1的情况已经计算过了)

    那么此时转化为i2个数的排列问题 注意是全排列 因为此时一定满足了Q序列大于p序列 那么其他乱排即可

    我们的x的值域有n2种情况 也就是要求x=3i(i2)!(x12+1)

    此时将(i2)!提出来 答案就是(i2)!x=1i2x 那么对于后面的柿子 等差数列求和即可

    答案就是(i2)!(i2)(i1)2

所以f[i]=f[i1]+f[i2](i1)+(i2)!(i2)(i1)2

法二:观察题意可以得到 答案即为n!|Q(p)=p|2

其中||表示这样的排列的个数

那么设置f[i]i长度的,Q(p)=p的排列个数 那么f[i]=f[i1]+f[i2](i1)

法二代码:

#include <bits/stdc++.h>
using namespace std;
#define int long long 
const int N = 1e7 + 5;
inline int read ()
{
	int x = 0 , f = 1;
	char ch = cin.get();
	while ( !isdigit ( ch ) ) { if ( ch == '-' ) f = -1; ch = cin.get(); }
	while ( isdigit ( ch ) ) { x = ( x << 1 ) + ( x << 3 ) + ( ch ^ 48 ); ch = cin.get(); }
	return x * f;
}

int n , mod , f[N] , fac[N];

int ksm ( int x , int k )
{
	int base = x , res = 1;
	while(k)
	{
		if ( k & 1 ) res = res * base % mod;
		base = base * base % mod;
		k >>= 1;
	}
	return res;
}

signed main ()
{
	ios::sync_with_stdio(false);
	cin.tie(0) , cout.tie(0);
	n = read() , mod = read();
	fac[1] = f[1] = f[0] = 1;
	int ans = 0;
	for ( int i = 2 ; i <= n ; i ++ ) fac[i] = fac[i-1] * i % mod;
	int inv = ksm ( 2 , mod - 2 ); 
	for ( int i = 2 ; i <= n ; i ++ ) f[i] = ( f[i-1] + ( i - 1 ) * f[i-2] % mod ) % mod , ans ^= ( ( mod + fac[i] - f[i] ) % mod * inv + mod ) % mod;
	cout << ans << endl;
	return 0;
}
posted @   Echo_Long  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示