ICPC-day1(NTT)

NTT经典例题

CCPC-Winter-Camp-day6-A——NTT经典例题

对于上面格式,如果想求出每个i的值可以使用卷积求出,因为阶乘j和阶乘i-j相乘的值为(i+(i-j))=i

补充一个二次剩余定理

P5491 【模板】二次剩余 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

//#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<numeric>
#include<cstring>//rfind("string"),s.find(string,begin)!=s.npos,find_first _of(),find_last_of()
#include<string>//to_string(value),s.substr(int begin, int length);
#include<cstdio>
#include<cmath>
#include<vector>//res.erase(unique(res.begin(), res.end()), res.end()),resize(n)//size of vector,vector<int>().swap(at[mx])
#include<queue>//priority_queue(big)  /priority_queue<int, vector<int>, greater<int>> q(small)
#include<stack>
#include<map>
#include<set>
#include<unordered_map>
#include<unordered_set>
#include<bitset>
#include<random>
#include<chrono>
//#include<ext/pb_ds/assoc_container.hpp>//gp_hash_table
//#include<ext/pb_ds/hash_policy.hpp>
//using namespace __gnu_pbds;
std::mt19937_64 rnd(std::chrono::steady_clock::now().time_since_epoch().count());
using namespace std;
#define int long long//__int128 2^127-1(GCC)
#define PII pair<int,int>
struct num {int x;// 实部int y;// 虚部(即虚数单位√w的系数)
};int t, w, n, p;num mul(num a, num b, int p) {// 复数乘法 num res;res.x = ((a.x * b.x % p + a.y * b.y % p * w % p) % p + p) % p;// x = a.x*b.x + a.y*b.y*wres.y = ((a.x * b.y % p + a.y * b.x % p) % p + p) % p;// y = a.x*b.y + a.y*b.xreturn res;
}
int qpow_r(int a, int b, int p) {// 实数快速幂 int res = 1;while (b) {if (b & 1) res = res * a % p;a = a * a % p;b >>= 1;}return res;
}
int qpow_i(num a, int b, int p) {// 复数快速幂  num res = { 1,0 };while (b) {if (b & 1) res = mul(res, a, p);a = mul(a, a, p);b >>= 1;}return res.x % p;// 只用返回实数部分,因为虚数部分没了 
}
int cipolla(int n, int p) {n %= p;if (qpow_r(n, (p - 1) / 2, p) == -1 + p) return -1;// 据欧拉准则判定是否有解 int a;while (1) {// 找出一个符合条件的aa = rand() % p;w = (((a * a) % p - n) % p + p) % p;// w = a^2 - n,虚数单位的平方if (qpow_r(w, (p - 1) / 2, p) == -1 + p) break;}num x = { a,1 };return qpow_i(x, (p + 1) / 2, p);
}
signed main() {srand(time(0));cin >> t;while (t--) {cin >> n >> p;if (!n) {printf("0\n");continue;}int ans1 = cipolla(n, p), ans2 = -ans1 + p;// 另一个解就是其相反数,ans1正数解 if (ans1 == -1) printf("Hola!\n");//无解else {if (ans1 > ans2) swap(ans1, ans2);if (ans1 == ans2) printf("%lld\n", ans1);else printf("%lld %lld\n", ans1, ans2);}}return 0;
}

NTT背包合并

NN​​​​​​​Fly (nowcoder.com)

PowerPoint 演示文稿 (nowcoder.com)

有点像数位dp,其中用到背包合并可以使用多项式解决,如果n个背包合并可以使用线段树和启发式合并类似的思想

//#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<numeric>
#include<cstring>//rfind("string"),s.find(string,begin)!=s.npos,find_first _of(),find_last_of()
#include<string>//to_string(value),s.substr(int begin, int length);
#include<cstdio>
#include<cmath>
#include<vector>//res.erase(unique(res.begin(), res.end()), res.end()),resize(n)//size of vector,vector<int>().swap(at[mx])
#include<queue>//priority_queue(big)  /priority_queue<int, vector<int>, greater<int>> q(small)
#include<stack>
#include<map>
#include<set>
#include<unordered_map>
#include<unordered_set>
#include<bitset>
#include<random>
#include<chrono>
//#include<ext/pb_ds/assoc_container.hpp>//gp_hash_table
//#include<ext/pb_ds/hash_policy.hpp>
//using namespace __gnu_pbds;
std::mt19937_64 rnd(std::chrono::steady_clock::now().time_since_epoch().count());
using namespace std;
#define int long long//__int128 2^127-1(GCC)
#define PII pair<int,int>
const int N = 3e6 + 5, mod = 998244353;
namespace ntt {const int g = 3;int a[N], b[N];int r[N], tot, bit;int invg;int qpow(int a, int b) {int res = 1;while (b) {if (b & 1) res = 1ll * res * a % mod;a = 1ll * a * a % mod;b >>= 1;}return res;}void add(int& a, int b) {a += b;if (a >= mod) a -= mod;}void NTT(int a[], int inv) {for (int i = 0; i < tot; i++)if (i < r[i])swap(a[i], a[r[i]]);for (int mid = 1; mid < tot; mid <<= 1) {int g1 = qpow(inv == 1 ? g : invg, (mod - 1) / (mid << 1));for (int i = 0; i < tot; i += mid << 1) {for (int j = 0, gk = 1; j < mid; j++, gk = 1ll * gk * g1 % mod) {int x = a[i + j], y = 1ll * gk * a[i + j + mid] % mod;a[i + j] = (x + y) % mod, a[i + j + mid] = (x - y + mod) % mod;}}}if (inv == -1) {int invtot = qpow(tot, mod - 2);for (int i = 0; i < tot; i++) {a[i] = 1ll * a[i] * invtot % mod;}}}struct Poly {vector<int> coef;int deg;int& operator[](int x) {return coef[x];}Poly(int deg = -1) : deg(deg) {coef = vector<int>(deg + 1, 0);}void norm(int deg) {this->deg = deg;coef.resize(deg + 1);}};void init(int len) {bit = tot = 0;while ((1ll << bit) <= len) bit++;tot = 1ll << bit;for (int i = 0; i < tot; i++) a[i] = b[i] = 0;for (int i = 1; i < tot; i++) r[i] = (r[i >> 1] >> 1) | ((i & 1) << (bit - 1));}Poly operator*(const Poly& f, const Poly& g) {Poly res(f.deg + g.deg);if (f.deg <= 8 || g.deg <= 8) {for (int i = 0; i <= f.deg; i++)for (int j = 0; j <= g.deg; j++)add(res[i + j], 1ll * f.coef[i] * g.coef[j] % mod);return res;}init(res.deg);copy(f.coef.begin(), f.coef.end(), a);copy(g.coef.begin(), g.coef.end(), b);NTT(a, 1), NTT(b, 1);for (int i = 0; i < tot; i++) a[i] = 1ll * a[i] * b[i] % mod;NTT(a, -1);copy(a, a + res.deg + 1, res.coef.begin());return res;}int __ = []{invg = qpow(g, mod - 2);return 0;}();
}
using namespace ntt;
signed main()
{ios_base::sync_with_stdio(0); cin.tie(0), cout.tie(0);int n, k;int m;cin >> n >> m >> k;vector<int>a(n + 1);vector<Poly>v;int sum = 0;for (int i = 1; i <= n; i++) {cin >> a[i];sum += a[i];Poly f(a[i]);f[0] = f[a[i]] = 1;v.emplace_back(f);}auto solve = [&](auto self, int l, int r)->Poly {if (l == r) return v[l];int mid = l + r >> 1;return self(self, l, mid) * self(self, mid + 1, r);};Poly f = solve(solve, 0, v.size() - 1);//assert(f.deg == sum);vector<vector<int>>ban(60, vector<int>());//array<vector<int>, 60>ban;while (k--){int b, c;cin >> b >> c;ban[c].push_back(b);}vector<Poly>dp(2);dp[0].norm(0);dp[0][0] = 1;for (int i = 0; i < 60; i++) {Poly g = f;sort(ban[i].begin(), ban[i].end());ban[i].erase(unique(ban[i].begin(), ban[i].end()), ban[i].end());for (auto x : ban[i]) {for (int j = a[x]; j <= sum; j++) {g[j] -= g[j - a[x]];if (g[j] < 0)g[j] += mod;}}vector<Poly>f(2), ndp(2);f[0] = dp[0] * g;f[1] = dp[1] * g;for (auto t : { 0,1 }) ndp[t].norm(f[t].deg / 2);for (auto t : { 0,1 }) {for (int j = 0; j <= f[t].deg; j++) {if (j % 2 == (m >> i & 1)) {add(ndp[t][j / 2], f[t][j]);}else if (j % 2 > (m >> i & 1)) {add(ndp[1][j / 2], f[t][j]);}else {add(ndp[0][j / 2], f[t][j]);}}}dp = ndp;}cout << dp[0][0] << "\n";
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/54242.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于工业物联网的能源监控系统:边缘数据处理的应用

论文标题&#xff1a;《Industrial IoT-Based Energy Monitoring System: Using Data Processing at Edge》 作者信息&#xff1a; Akseer Ali MiraniAnshul AwasthiNiall O’MahonyJoseph Walsh 他们均来自爱尔兰的芒斯特技术大学IMaR研究中心&#xff0c;以及位于利默里克的…

JVM 基础、GC 算法与 JProfiler 监控工具详解

目录 1、引言 1.1 JVM内存与本地内存 1.2 JVM与JDK的关系 2、JVM基础 2.1 JVM&#xff08;Java Virtual Machine&#xff09; 2.2 Java与JVM的关系 2.3 JVM的内存结构 2.3.1 堆内存 2.3.2 栈内存 2.3.3 方法区 2.3.4 本地方法栈 2.3.5 程序计数器&#xff08;PC寄存…

【MySQL 07】内置函数

目录 1.日期函数 日期函数使用场景&#xff1a; 2.字符串函数 字符串函数使用场景&#xff1a; 3.数学函数 4.控制流函数 1.日期函数 函数示例&#xff1a; 1.在日期的基础上加日期 在该日期下&#xff0c;加上10天。 2.在日期的基础上减去时间 在该日期下减去2天 3.计算两…

Android Context是什么?有很多的context他们之间有什么区别?什么时候该使用哪个?

目录 一、Context是什么&#xff1f; 在Android中&#xff0c;Context是一个抽象类 &#xff0c;它代表了应用程序的当前状态&#xff0c;包括资源和类加载器等&#xff0c;它提供了一个应用运行所需的信息&#xff0c;比如我们要获取资源 &#xff0c;那么需要她&#xff0c;…

雷池 WAF 如何配置才能正确获取到源 IP

经常有大哥反馈说雷池攻击日志里显示的 IP 有问题。 这里我来讲一下为什么一些情况下雷池显示的攻击 IP 会有问题。 问题说明 默认情况下&#xff0c;雷池会通过 HTTP 连接的 Socket 套接字读取客户端 IP。在雷池作为最外层网管设备的时候这没有问题&#xff0c;雷池获取到的…

【寻找one piece的算法之路】——双指针算法!他与她是否会相遇呢?

&#x1f490;个人主页&#xff1a;初晴~ &#x1f4da;相关专栏&#xff1a;寻找one piece的刷题之路 什么是双指针算法 双指针算法是一种常用的编程技巧&#xff0c;尤其在处理数组和字符串问题时非常有效。这种方法的核心思想是使用两个指针来遍历数据结构&#xff0c;这两…

【HTML+CSS】仿电子美学打造响应式留言板

创建一个响应式的留言板 在这篇文章中&#xff0c;我们将学习如何创建一个简单而美观的留言板&#xff0c;它将包括基本的样式和动画效果&#xff0c;以及响应式设计&#xff0c;确保在不同设备上都能良好显示。 HTML 结构 首先&#xff0c;我们创建基本的HTML结构。留言板由…

Android SQLite的基本使用、生成Excel文件保存到本地

1. Android SQLite的基本使用 1.1. SQLiteOpenHelper Android 底层已经通过一个SQLiteOpenHelper的抽象类将数据库的创建&#xff0c;以及修改&#xff0c;更新等都放在了里面。 要使用它必须实现它的OnCreate(SQLiteDatabase db)&#xff0c;onUpgrade(SQLiteDatabase db, int…

YOLOv11改进 | 独家创新- 注意力篇 | YOLOv11结合全新多尺度线性注意力机制MLAttention(全网独家创新)

1. MLAttention介绍 (1). 多尺度卷积操作&#xff1a;MLAttention通过多尺度卷积操作来增强不同尺度的特征表达能力。采用了多种卷积核尺寸&#xff08;例如5x5、1x7、7x1、1x11、11x1、1x21、21x1&#xff09;的深度可分离卷积来捕捉不同感受野的特征。较小的卷积核擅长捕捉细…

TypeScript 算法手册【快速排序】

文章目录 1. 快速排序简介1.1 快速排序定义1.2 快速排序特点 2. 快速排序步骤过程拆解2.1 选择基准元素2.2 划分数组2.3 递归排序 3. 快速排序的优化3.1 三数取中法选择基准3.2 插入排序与快速排序结合案例代码和动态图 4. 快速排序的优点5. 快速排序的缺点总结 【 已更新完 Ty…

C语言基础(7)之操作符(1)(详细介绍)

目录 1. 各种操作符介绍 1.1 操作符汇总表 2. 移位操作符 2.1 移位操作符知识拓展 —— 原码、反码、补码 2.2 移位操作符讲解 2.2.1 右移操作符 ( >> ) 2.2.2 左移操作符 ( << ) 3. 位操作符 3.1 & (按位与) 3.2 | (按位或) 3.3 ^ (按位异或) 3.4…

排序算法之——归并排序,计数排序

文章目录 前言一、归并排序1. 归并排序的思想2. 归并排序时间复杂度及空间复杂度3. 归并排序代码实现1&#xff09;递归版本2&#xff09;非递归版本 二、计数排序1. 计数排序的思想2. 计数排序的时间复杂度及空间复杂度3. 计数排序代码实现 总结&#xff08;排序算法稳定性&am…

【JavaEE】——线程池大总结

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯&#xff0c; 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01;希望本文内容能够帮助到你&#xff01; 目录 引入&#xff1a;问题引入 一&#xff1a;解决方案 1&#xff1a;方案一——协程/纤程 &#xff08;1…

【完-网络安全】Windows注册表

文章目录 注册表启动项及常见作用五个根节点常见入侵方式 注册表 注册表在windows系统的配置和控制方面扮演了一个非常关键的角色&#xff0c;它既是系统全局设置的存储仓库&#xff0c;也是每个用户的设置信息的存储仓库。 启动项及常见作用 快捷键 WinR打开运行窗口&#x…

【C++】C++基础

目录 一. C关键字(C98) 二、C的第一个程序 三、命名空间 3.1.namespace的价值 3.2.namespace的定义 3.2.命名空间使用 总结&#xff1a;在项目当中第一、第二种方法搭配使用&#xff0c;第三种冲突风险非常大&#xff0c;仅适合练习使用。 四、C输入&输出 五、缺省…

调试分析:[跳数度量]更改为[距离度量]后的 routing_bellmanford 算法

回顾复习2023年8月的《★修改Exata6.2源码&#xff1a;〔修改Bellmanford最短路径路由的衡量标准从【路由跳数】改为【“路由器节点间的物理距离”】&#xff0c;并动画演示〕》&#xff0c;VS2015调试Exata&#xff0c;跟踪调试修改后的[ routing_bellmanford.cpp ]源码&#…

k8s架构,从clusterIP到光电半导体,再从clusterIP到企业管理

clusterIP作为k8s中的服务&#xff0c; 也是其他三个服务的基础 ~]$ kubectl create service clusterip externalname loadbalancer nodeport 客户端的流量到service service分发给pod&#xff0c;pod由控制器自动部署&#xff0c;自动维护 那么问题是service的可用…

计算机网络期末复习真题(附真题答案)

前言&#xff1a; 本文是笔者在大三学习计网时整理的笔记&#xff0c;哈理工的期末试题范围基本就在此范畴内&#xff0c;就算真题有所更改&#xff0c;也仅为很基础的更改数值&#xff0c;大多跑不出这些题&#xff0c;本文包含简答和计算等大题&#xff0c;简答的内容也可能…

【RADARSAT Constellation Mission(RCM)卫星星座简介】

RADARSAT Constellation Mission&#xff08;RCM&#xff09;卫星星座是加拿大太空局&#xff08;CSA&#xff09;的下一代C波段合成孔径雷达&#xff08;SAR&#xff09;卫星星座&#xff0c;以下是对其的详细介绍&#xff1a; 一、基本信息 发射时间&#xff1a;2019年6月…

基于微信小程序的四六级词汇+ssm(lw+演示+源码+运行)

摘 要 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;四六级词汇小程序被用户普遍使用&#xff0c;为方便用户能…