J - N的阶乘 mod P

#include <stdio.h>

int main() {
	int n, p;

	while (~scanf("%d%d", &n, &p)) {
		int i;
		long long sum = 1;

		for (i = n; i > 0; i--) {
			sum = (sum * i) % p;//防止数据损失
		}
		if (!n)//注意n等于0时
			printf("0\n");
		else
			printf("%lld\n", sum);
	}
	return 0;
}

#include<bits/stdc++.h> using namespace std; const int N = 3e5 + 5; //const int mod = 1e9 + 7; const int mod = 998244353; //const int mod = 10007; typedef long long ll; #define int ll #define lowbit(x) x & -x #define rep(l,r) for(int i = l; i < r; i++) #define repn(l,r) for(int i = l; i <= r; i++) const ll INF = 1e18; int a[N]; int p[N], p_i[N]; int min_p[N]; vector<int> q; int fast_pow(int d, int n, int mod) { // 快速幂 int res = 1LL; while (n) { if (n & 1) res = (res % mod * d % mod) % mod; d = (d % mod * d % mod) % mod; n >>= 1; } return res; } void init() {// 预处理阶乘和逆元 p[0] = 1; for (int i = 1;i < N; i++) { p[i] = p[i - 1] * i % mod; } p_i[N - 1] = fast_pow(p[N - 1], mod - 2, mod); for (int i = N - 2;i >= 0; i--) { p_i[i] = p_i[i + 1] * (i + 1) % mod; } } void init_min() { for (int i = 2;i < N;i++) { if (!min_p[i]) { min_p[i] = i; q.push_back(i); } for (auto j : q) { if (j > min_p[i] || i * j >= N) break; min_p[i * j] = j; } } } int c(int n, int k) {// 求组合数 if (k < 0 || k > n) return 0; return p[n] * p_i[k] % mod * p_i[n - k] % mod; } vector<int> g(int x) { // 分解质因数 vector<int> res; while (x > 1) { int pi = min_p[x]; res.push_back(pi); while (x % pi == 0) x /= pi; } sort(res.begin(), res.end()); res.erase(unique(res.begin(), res.end()), res.end()); return res; } void solve() { int n, k; cin >> n >> k; repn(1, n) cin >> a[i]; map<int, int> mp; for (int i = 1;i <= n;i++) { auto b = g(a[i]); sort(b.begin(), b.end()); b.erase(unique(b.begin(), b.end()), b.end()); for (auto &j : b) { mp[j]++; } } int ans = 0; for (auto& i : mp) { int t = c(n, k); int p = c(n - i.second, k); int v = (t - p + mod) % mod; ans = (ans + v * i.first) % mod; } cout << ans << "\n"; } signed main() { ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr); init(); int T = 1;cin >> T;while (T--) solve(); return 0; }
07-18
ll norm(ll x) {//工具函数(映射到[0,MOD-1];处理负数) rt(x % MOD + MOD) % MOD; } ll mod_add(ll a, ll b) {//模加法 rt norm(a + b); } ll mod_sub(ll a, ll b) {//模减法 rt norm(a - b); } //计算模乘法(快速版) ll mod_qmul(ll a, ll b) { a %= MOD; b %= MOD; ll res = 0; while (b > 0) { if (b & 1) { res = (res + a) % MOD; } a = (a << 1) % MOD; b >>= 1; } rt res; } //计算模乘法(基础版) ll mod_fmul(ll a, ll b) { rt((a % MOD) * (b % MOD)) % MOD; } //计算斐波那契数列第n个数(非递归) ll fibonacci1(in n) { if (n == 0) rt 0; if (n == 1) rt 1; ll prev = 0; ll curr = 1; ll next; for (in i = 2; i <= n; i++) { next = prev + curr; prev = curr; curr = next; } rt curr; } //计算斐波那契数列第n个数(仅递归) ll fibonacci2(in n) { if (n == 0) { rt 0; } else if (n == 1 || n == 2) { rt 1; } rt fibonacci2(n - 1) + fibonacci2(n - 2); } //计算斐波那契数列第n个数(递归;预存储;重复调用;取模;小n;越界MAX_L#-1) ll mem[MAX_L] = { 0 };//存储数组 ll vis[MAX_L] = { 0 };//记忆数组 vd reset() {//初始化记忆数组 memset(vis, 0, sizeof(vis)); } ll fibonacci_mem(in n) {//(嵌mod_add) if (n < 0 || n >= MAX_L) rt - 1; if (n == 0) rt 0; if (n == 1) rt 1; if (vis[n]) rt mem[n]; mem[n] = mod_add(fibonacci_mem(n - 1), fibonacci_mem(n - 2)); vis[n] = 1; rt mem[n]; } //计算斐波那契数列第n个数(迭代;非存储;单次调用;取模;大n;越界MAX_L#-1) ll fib_iterative(in n) { if (n < 0 || n >= MAX_L) return -1; if (n == 0) return 0; if (n == 1) return 1; ll f0 = 0, f1 = 1; for (in i = 2; i <= n; ++i) { ll f2 = mod_add(f0, f1); f0 = f1; f1 = f2; } return f1; } //计算给定数n的阶乘(非递归;取模;错误#-1) ll factorial1(in n) { if (n < 0) rt - 1; ll result = 1; for (in i = 2; i <= n; i++) { result = ((result % MOD) * (i % MOD)) % MOD; } rt result; } //计算给定数n的阶乘(仅递归;取模) ll factorial2(in n) { if (n <= 1) { rt 1; } rt((n % MOD) * (factorial2(n - 1) % MOD)) % MOD; } //计算排列数P(对n排k;取模;错误#-1) ll Per(in n, in k) { if (k < 0 || n < 0 || k > n) { rt - 1; } ll result = 1; for (in i = n - k + 1; i <= n; i++) { result = (result * i) % MOD; } rt result; } //计算组合数C(对n组k;特殊;错误#-1) ll Com_sp(in n, in k) { if (k < 0 || n < 0 || k > n) { rt - 1; } if (k > n - k) { k = n - k; } ll result = 1; for (in i = 0; i < k; i++) { result = result * ((ll)n - i) / ((ll)i + 1); } rt result; } //生成下一个排列(全排列;自修改;无内嵌;有效#1;无效#0) in NPer(in a[], in n) { if (n <= 1) rt 0; in i, j; for (i = n - 2; i >= 0 && a[i] >= a[i + 1]; i--); if (i < 0) rt 0; for (j = n - 1; j >= 0 && a[j] <= a[i]; j--); in tmp = a[i]; a[i] = a[j]; a[j] = tmp; for (in l = i + 1, r = n - 1; l < r; l++, r--) { tmp = a[l]; a[l] = a[r]; a[r] = tmp; } rt 1; } //计算幂次(快速幂)(base的exp次方;取模) ll pow_mod(ll base, ll exp) { ll result = 1; while (exp > 0) { if (exp & 1) { result = (result * base) % MOD; } base = (base * base) % MOD; exp >>= 1; } rt result; } //计算二元最大公因数(绝对值) ll gcd2(ll a, ll b) { if (a < 0) a = -a; if (b < 0) b = -b; while (b != 0) { ll temp = b; b = a % b; a = temp; } rt a; } //计算三元最大公因数(嵌gcd2) ll gcd3(ll a, ll b, ll c) { rt gcd2(gcd2(a, b), c); } //计算n元最大公因数(数组[1,n);嵌gcd2) ll gcdn(ll arr[], in n) { if (n == 0) rt 0; ll result = arr[0]; for (in i = 1; i < n; ++i) { result = gcd2(result, arr[i]); if (result == 1) br; } rt result; } //计算二元最小公倍数(嵌gcd2) ll lcm2(ll a, ll b) { if (a == 0 || b == 0) rt 0; ll ga = a < 0 ? -a : a; ll gb = b < 0 ? -b : b; ll g = gcd2(ga, gb); rt ga / g * gb; } //计算三元最小公倍数(嵌lcm2) ll lcm3(ll a, ll b, ll c) { rt lcm2(lcm2(a, b), c); } //计算n元最小公倍数(数组[1,n);嵌lcm2) ll lcmn(ll arr[], in n) { if (n == 0) rt 1; ll result = arr[0]; for (in i = 1; i < n; ++i) { result = lcm2(result, arr[i]); if (result == 0) br; } rt result; } in main() { ll x; ll y; while ((scll2(x, y)) != EOF) { ll moda = mod_add(x, y); ll mods = mod_sub(x, y); ll modqm = mod_qmul(x, y); ll modfm = mod_fmul(x, y); prlln(moda); prlln(mods); prlln(modqm); prlln(modfm); }
12-06
独立储能的现货电能量与调频辅助服务市场出清协调机制(Matlab代码实现)内容概要:本文围绕“独立储能的现货电能量与调频辅助服务市场出清协调机制”展开,提出了一种基于Matlab代码实现的优化模型,旨在协调独立储能系统在电力现货市场与调频辅助服务市场中的联合出清问题。文中结合鲁棒优化、大M法和C&CG算法处理不确定性因素,构建了多市场耦合的双层或两阶段优化框架,实现了储能资源在能量市场和辅助服务市场间的最优分配。研究涵盖了市场出清机制设计、储能运行策略建模、不确定性建模及求解算法实现,并通过Matlab仿真验证了所提方法的有效性和经济性。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及从事电力市场、储能调度相关工作的工程技术人员。; 使用场景及目标:①用于研究独立储能在多电力市场环境下的协同优化运行机制;②支撑电力市场机制设计、储能参与市场的竞价策略分析及政策仿真;③为学术论文复现、课题研究和技术开发提供可运行的代码参考。; 阅读建议:建议读者结合文档中提供的Matlab代码与算法原理同步学习,重点关注模型构建逻辑、不确定性处理方式及C&CG算法的具体实现步骤,宜在掌握基础优化理论的前提下进行深入研读与仿真调试。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YikZ__08-01

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值