海亮 7.11 模拟赛3
海亮 7.11 模拟赛
大寄特寄
#A. 计数练习
法一:
我们考虑设
分三种情况 对于
-
如果
序列的第一位为 那么置换后第一位也是 只需要满足后续排列即可 计入答案为 -
如果
序列的第一位为 那么在 序列中 位置填上一个 即可满足那么这两个位置已经固定了 其余就是
的排列问题为什么不用
而用 呢? 因为你更换了这两个值之后 排列后这两个位置和原序列是不变的 其他地方还是需要满足排列的规则此时
的位置有 种 计入答案为 -
的第一位不是 那么必须满足这一位的值小于 值域为 (因为我们值为 的情况已经计算过了)那么此时转化为
个数的排列问题 注意是全排列 因为此时一定满足了 序列大于 序列 那么其他乱排即可我们的
的值域有 种情况 也就是要求此时将
提出来 答案就是 那么对于后面的柿子 等差数列求和即可答案就是
所以
法二:观察题意可以得到 答案即为
其中
那么设置
法二代码:
#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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)