The 2019 ICPC China Nanchang National Invitational and International Silk-Road Programming Contest B、H
比赛链接https://www.jisuanke.com/contest/3098?view=challenges
B题 拉格朗日插值
题意 T组输入。一个n次多项式 f(x) ,每项的系数不知道,只知道f(0),f(1)..f(n) 的值,m个询问,L,R。计算$\sum_{i=L}^{R}f(i)\quad mod(9999991)$
$(1\leq T\leq 5) $
$(1\leq n\leq 1000) $
$(1\leq m\leq 2000) $
$(1\leq L\leq R \leq 9999990)$
解析 遇到这题我是崩溃的,听大家说是拉格朗日插值,找到了一个快速拉格朗日的板子,贴上去就过了。。。
#include<bits/stdc++.h>
using namespace std;
#define maxn 1010
typedef long long LL;
const LL mod = ; LL powmod(LL aa, LL x) {
LL res = ;
for(; x > ; x >>= ) {
if(x & )res = (res * aa) % mod;
aa = (aa * aa) % mod;
}
return res;
} struct lagrange {
#define ll long long
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define D 2010 //D比MAXN大100就行
ll a[D], f[D], g[D], p[D], p1[D], p2[D], b[D], h[D][], C[D];
void init(int M) {//初始化:参数填MAXN + 20
f[] = f[] = g[] = g[] = ;
rep(i, , M + ) f[i] = f[i - ] * i % mod;
g[M + ] = powmod(f[M + ], mod - );
per(i, , M + ) g[i] = g[i + ] * (i + ) % mod;
}
/*给定一组样本数据a[],规模为0-d,计算出第n项*/
ll calcn(int d, ll *a, ll n) {
if (n <= d) return a[n];
p1[] = p2[] = ;
rep(i, , d + ) {
ll t = (n - i + mod) % mod;
p1[i + ] = p1[i] * t % mod;
}
rep(i, , d + ) {
ll t = (n - d + i + mod) % mod;
p2[i + ] = p2[i] * t % mod;
}
ll ans = ;
rep(i, , d + ) {
ll t = g[i] * g[d - i] % mod * p1[i] % mod * p2[d - i] % mod * a[i] % mod;
if ((d - i) & ) ans = (ans - t + mod) % mod;
else ans = (ans + t) % mod;
}
return ans;
}
/*
给定一组观测点(0, a[0]), (1, a[1]), ...,(m, a[m]),、
样本点的个数为a(x)的最高次+1。
求在该函数模型下,a[0]+a[1]+...+a[n]的和。
*/
ll ta[D];
ll polysum(ll m, ll *a, ll n) { // 给定a[0].. a[m],求\sum_{i=0}^{n}a[i]
memcpy(ta, a, sizeof(a[]) * (m + ));
ta[m + ] = calcn(m, ta, m + );
rep(i, , m + )ta[i] = (ta[i - ] + ta[i]) % mod;
return calcn(m + , ta, n);
}
};
int main()
{
int t;
scanf("%d",&t);
while(t--){
ll a[maxn],n,m;
scanf("%lld%lld",&n,&m);
for(int i=;i<=n;i++){
scanf("%lld",&a[i]);
}
lagrange ri;
ri.init(maxn+);
while(m--){
ll l,r;
scanf("%lld%lld",&l,&r);
printf("%lld\n",(ri.polysum(n,a,r)-ri.polysum(n,a,l-)+mod)%mod);
}
}
}
H题 FWT+线段树
题意 一个n代表A,B数组的长度,A,B两个数组中的数两两或(二进制运算)一下 ,得到一个不去重C数组(显然C的长度为n*n)。接下来一个m代表操作次数,每次输入两个数L,R
如果L等于0,表示询问C数组中第R个数,否则表示C数组中第L个数到第R个数 开根号。
解析 用FWT求出来 or 之后 每个数的个数,然后建立权值线段树,或者前缀和+二分,都可以log时间复杂度求出第k个数是几。只需要知道这个数开了几次根号,L,R会很大,
但是数量只有那么多,离散化一下就可以解决了,1e5开根号大于5次就是1了,小于5次暴力开就好了。
#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef long long ll;
typedef pair<int,int> Pii;
const int maxn = 3e5+; ll a[maxn],b[maxn],c[maxn];
void FWT_or(ll *a,int N,int opt)
{
for(int i=;i<=N;i<<=)
for(int p=i<<,j=;j<=N;j+=p)
for(int k=;k<i;++k)
if(opt==)a[i+j+k]=a[j+k]+a[i+j+k];
else a[i+j+k]=a[i+j+k]-a[j+k];
}
ll C[maxn];
int lowbit(int x)
{
return x&(-x);
}
ll bitgetsum(int x)
{
ll ans=;
for(int i=x;i>;i-=lowbit(i))
ans+=C[i];
return ans;
}
void bitupdate(int x,int z)
{
for(int i=x;i<=3e5;i+=lowbit(i))
C[i]+=z;
}
struct ndoe
{
ll l,r;
}q[maxn];
vector<ll> v;
int getid(ll x){
return lower_bound(all(v),x)-v.begin()+;
}
ll sum[maxn*];
void pushUp(int rt)
{
sum[rt]=sum[rt<<]+sum[rt<<|];
}
void build(int l,int r,int rt)
{
if(l==r){
sum[rt]=c[l];
return;
}
int m=(l+r)>>;
build(l,m,rt<<);
build(m+,r,rt<<|);
pushUp(rt);
}
int query(ll val,int l,int r,int rt)
{
if(l==r){
return l;
}
int mid=(l+r)>>;
if(sum[rt<<]>=val)
return query(val,l,mid,rt<<);
else
return query(val-sum[rt<<],mid+,r,rt<<|);
}
int main()
{
int n,x,m;
scanf("%d",&n);
for(int i=;i<n;i++){
scanf("%d",&x);a[x]++;
}
for(int i=;i<n;i++){
scanf("%d",&x);b[x]++;
}
n=2e5;
FWT_or(a,n,);FWT_or(b,n,);
for(int i=;i<=n;i++) c[i]=1ll*a[i]*b[i];
FWT_or(c,n,-);build(,n,);
scanf("%d",&m);
for(int i=;i<m;i++){
scanf("%lld%lld",&q[i].l,&q[i].r);
v.pb(q[i].r);
if(q[i].l!=)
v.pb(q[i].l);
}
sort(all(v));
v.erase(unique(all(v)),v.end());
for(int i=;i<m;i++){
if(q[i].l!=){
bitupdate(getid(q[i].l),);
bitupdate(getid(q[i].r)+,-);
}
else{
int ans,times = bitgetsum(getid(q[i].r));
if(times>=){
ans=;
}
else{
ans = query(q[i].r,,n,);
while(times--){
ans=floor(sqrt(ans));
}
}
printf("%d\n",ans);
}
}
return ;
}
The 2019 ICPC China Nanchang National Invitational and International Silk-Road Programming Contest B、H的更多相关文章
- The 2019 ICPC China Nanchang National Invitational and International Silk-Road Programming Contest
目录 Contest Info Solutions A. Attack B. Polynomial E. Interesting Trip F. Sequence G. Winner H. Anoth ...
- The 2019 ICPC China Nanchang National Invitational and International Silk-Road Programming Contest - F.Sequence(打表+线段树)
题意:给你一个长度为$n$的数组,定义函数$f(l,r)=a_{l} \oplus a_{l+1} \oplus...\oplus a_{r}$,$F(l,r)=f(l,l)\oplus f(l,l+ ...
- The Preliminary Contest for ICPC China Nanchang National Invitational and International Silk-Road Programming Contest
打网络赛 比赛前的准备工作要做好 确保 c++/java/python的编译器能用 打好模板,放在桌面 A. PERFECT NUMBER PROBLEM #include <cstdio> ...
- 2019The Preliminary Contest for ICPC China Nanchang National Invitational
The Preliminary Contest for ICPC China Nanchang National Invitational 题目一览表 考察知识点 I. Max answer 单调栈+ ...
- 计蒜客 38229.Distance on the tree-1.树链剖分(边权)+可持久化线段树(区间小于等于k的数的个数)+离散化+离线处理 or 2.树上第k大(主席树)+二分+离散化+在线查询 (The Preliminary Contest for ICPC China Nanchang National Invitational 南昌邀请赛网络赛)
Distance on the tree DSM(Data Structure Master) once learned about tree when he was preparing for NO ...
- 2019 The Preliminary Contest for ICPC China Nanchang National Invitational(A 、H 、I 、K 、M)
A. PERFECT NUMBER PROBLEM 题目链接:https://nanti.jisuanke.com/t/38220 题意: 输出前五个完美数 分析: 签到.直接百度完美数输出即可 #i ...
- ICPC China Nanchang National Invitational -- D. Match Stick Game(dp)
题目链接:https://nanti.jisuanke.com/t/38223 题意:有一堆火柴构成了一个加减法式子,你可以把火柴重新组合,要求数字个数和原来一样多,每个数字的位数和对应原数字位数一样 ...
- The Preliminary Contest for ICPC China Nanchang National Invitational I. Max answer (单调栈+线段树)
题目链接:https://nanti.jisuanke.com/t/38228 题目大意:一个区间的值等于该区间的和乘以区间的最小值.给出一个含有n个数的序列(序列的值有正有负),找到该序列的区间最大 ...
- The Preliminary Contest for ICPC China Nanchang National Invitational I题
Alice has a magic array. She suggests that the value of a interval is equal to the sum of the values ...
随机推荐
- 关于MySQL的驱动org.gjt.mm.mysql.Driver
今天看了一个比较老视频使用org.gjt.mm.mysql.Driver来驱动连接,便试了一下看看怎么样,结果一直连不上数据库,后来看了tomcat的后台发现有报这个问题,于是把驱动改成com.mys ...
- hdu 1875 最小生成树 prime版
最小生成树prime版 大致的步骤 首先选取一个到集合最近的点 然后标记起在集合内部 然后更新最短距离 畅通工程再续 Time Limit: 2000/1000 MS (Java/Others) ...
- Asp.Net Core 轻松学系列-5利用 Swagger 自动生成接口文档
目录 前言 结语 源码下载 前言 目前市场上主流的开发模式,几乎清一色的前后端分离方式,作为服务端开发人员,我们有义务提供给各个客户端良好的开发文档,以方便对接,减少沟通时间,提高开发效率:对 ...
- map自定义键值类型
map自定义键值类型 改变Map的默认比较方式 https://www.cnblogs.com/zjfdlut/archive/2011/08/12/2135698.html 大家知道,STL中的ma ...
- IE6图片透明问题
网上很多解决IE6下png透明问题的方案,但是经本人实践,有的时候有用,有的时候并不能解决自己的问题.当是后者的时候,想到另外一种办法,就是当在IE6.IE7下使用gif图片,自己在测试的时候,如果g ...
- form-create教程:移除默认提交按钮
本文将介绍form-create如何修改,隐藏默认提交按钮 form-create 是一个可以通过 JSON 生成具有动态渲染.数据收集.验证和提交功能的表单生成器.并且支持生成任何 Vue 组件.结 ...
- php获取客户机mac地址
@exec("arp -a",$array); //执行arp -a命令,结果放到数组$array中 foreach($array as $value){ //匹配结果放到数组$m ...
- iOS中的分类(category)和类扩展(extension)
今天在研究swift的时候看到了分类和扩展.这是两个十分重要有用的功能,但是之前用的不多,没有深入了解过,在今天就从头理一遍. 一.分类(Category): 概念: 分类(Category)是OC中 ...
- stm32 ADC模数转换 ADC多通道 ADC DMA
通过调节电位器,改变AD转换值和电压值 STM32F1 ADC 配置步骤 1.使能GPIO时钟和ADC时钟 2.配置引脚模式为模拟输入 3.配置ADC的分频因子 4.初始化ADC参数,ADC_Init ...
- ant design pro超详细入门教程
1.Ant Design Pro 初了解 说到ant design pro,得先了解一下ant design是个什么东西?ant design蚂蚁金服基于react打造的一个服务于企业级产品的UI框架 ...