时间带着明显的恶意,缓缓在我的头顶流逝。

T1 Prime

解题思路

成功没有签上到。。。

一看数据范围 \(R-L+1\le 10^7,R\le 10^{14}\) ,这肯定是判断范围内的数字是否可行之后直接暴力扫啊。。

然后我们就考虑线性筛,筛出 \(\min(\sqrt{R},K)\) 之间的素数。

算出素数来有什么用呢(没什么用,所以我们筛完之后不用)

发现对于一个数字 \(x\) 而言,它除了本身之外的因数一定是 \(\le \sqrt{x}\) 的。

然后我们就可以根据已经筛出来的素数直接暴力向后更新倍数就好了,设素数个数是 \(n\) ,调和级数所以复杂度是 \(n\times ln\;n\) 的。

code

#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"Pass"<<endl
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
const int N=1e7+10;
int l,r,m,ans,cnt,pri[N];
bool vis[N],b[N];
void Prime()
{
int temp=min((int)sqrt(r),m);
for(int i=2;i<=temp;i++)
{
if(!vis[i]) pri[++cnt]=i;
for(int j=1;j<=cnt&&pri[j]*i<=temp;j++)
{
vis[i*pri[j]]=true;
if(i%pri[j]==0) break;
}
}
}
signed main()
{
l=read(); r=read(); m=read();
Prime();
int temp=min((int)sqrt(r),m);
for(int i=1;i<=cnt;i++)
for(int j=ceil((1.0*l)/(1.0*pri[i]));j<=r/pri[i];j++)
b[j*pri[i]-l]=true;
for(int i=l;i<=r;i++)
{
if(i<=temp){if(vis[i]) continue;}
else if(b[i-l]) continue;
ans^=i;
}
printf("%lld",ans);
return 0;
}

T2 Sequence

解题思路

矩阵乘法优化 DP。

先考虑怎么算不同子序列个数。设 \(f_i\) 表示当前以i结尾的子序列个数,如果整个序列的

下一个元素是 \(x\), 那么令 \(f_x=1+\sum\limits_{i=1}^k f_i\),其它的dp值保持不变。

发现无论下一个数字填什么其实都是一样的因此我们要最大化 \(\sum\limits_{i=1}^k f_i\),贪心选择剩下 DP 值最小的,也就是最后出现位置最靠前的位置。

然后对于这样的转移我们可以选择矩阵乘法,一次搞 k 次可以通过此题。

code

#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"Pass"<<endl
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
const int N=1e6+10,M=110,mod=1e9+7;
const double base=1e7;
int n,m,K,f[M],s[N],id[N],e[M],fro[N];
struct Matrix
{
int s[M][M];
Matrix(){memset(s,0,sizeof(s));}
Matrix friend operator * (Matrix x,Matrix y)
{
Matrix sum;
for(int i=1;i<=K+1;i++)
for(int j=1;j<=K+1;j++)
{
for(int k=1;k<=K+1;k++)
sum.s[i][j]=(sum.s[i][j]+x.s[i][k]*y.s[k][j]%mod);
sum.s[i][j]%=mod;
}
return sum;
}
}ans,mat;
Matrix power(Matrix x,int y)
{
Matrix sum;
for(int i=1;i<=K+1;i++)
sum.s[i][i]=1;
while(y)
{
if(y&1) sum=sum*x;
x=x*x;
y>>=1;
}
return sum;
}
bool comp(int x,int y)
{
return fro[x]<fro[y];
}
signed main()
{
n=read(); m=read(); K=read();
int sum=0;
for(int i=1,las;i<=n;i++)
{
s[i]=read(); las=sum;
sum=(2*sum+1-f[s[i]]+mod)%mod;
f[s[i]]=las+1; fro[s[i]]=i;
}
for(int i=1;i<=K;i++) id[i]=i;
sort(id+1,id+K+1,comp);
for(int i=1;i<=K;i++) ans.s[1][i]=f[id[i]];
ans.s[1][K+1]=1;
for(int i=1;i<=K;i++)
{
memset(e,0,sizeof(e));
e[i]=1; sum=1;
for(int j=1;j<=K;j++)
{
int temp=sum;
sum=(sum*2-e[j]+mod)%mod;
e[j]=temp;
}
for(int j=1;j<=K;j++)
mat.s[i][j]=e[j];
}
memset(e,0,sizeof(e));
sum=0;
for(int i=1;i<=K;i++)
{
int temp=sum;
sum=(sum*2+1-e[i]+mod)%mod;
e[i]=temp+1;
}
for(int i=1;i<=K;i++)
mat.s[K+1][i]=e[i];
mat.s[K+1][K+1]=1; sum=0;
ans=ans*power(mat,m/K);
for(int i=1;i<=K;i++)
f[i]=ans.s[1][i],sum=(sum+f[i])%mod;
for(int i=1;i<=m%K;i++)
{
int temp=sum;
sum=(sum*2+1-f[i]+mod)%mod;
f[i]=temp+1;
}
printf("%lld",sum);
return 0;
}

T3 Omeed

解题思路

大概有两种打法吧。。

对于基础分数的贡献十分简单在此不做过多的赘述。

对于连击分数的每个位置 \(i\) 对于下一位的贡献设为 \(f_i\),就有了下面的柿子:

\[f_i=p_i\times (f_{i-1}+1)+(1-p_i)\times f_{i-1}\times t
\]

经过层层化简就可以得到类似于 \(f_{i}=k\times f_{L-1}+b\) 的柿子,然后发现 \(k\times f_{L-1}\) 啥用没有,于是可以直接维护 \(b\) 的加和。

上面的是一种做法,但是实现起来比较麻烦,我直接。。。

下面讲一下另一种做法。。。

还是化简柿子,可以得到 \(\displaystyle f_k=\sum_{i=L}^{k}p_i\prod_{j=i+1}^{k}(t+p_j-p_j\times t)\)

然后对于每一个区间也是维护 \(k,b\) ,与上面做法不同的是这里的取值与左端点 \(f_L\) 的取值有关系,因此需要对于每个区间的右端点进行维护,用于合并信息。

亿点卡常。

code

#include<bits/stdc++.h>
#define ull unsigned long long
#define f() cout<<"Pass"<<endl
#define ls x<<1
#define rs x<<1|1
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
const int N=5e5+10,mod=998244353;
int task,ta,tb,n,q,t,a,b,p[N],f[N];
int power(int x,int y)
{
int temp=1;
while(y)
{
if(y&1) temp=1ll*temp*x%mod;
x=1ll*x*x%mod;
y>>=1;
}
return temp;
}
int inv(int x){return power(x,mod-2)%mod;}
struct Segment_Tree
{
int dat,k,b,datk,datb;
}tre[N<<1];
void update(int x,int num)
{
tre[x].dat=tre[x].b=tre[x].datk=tre[x].datb=num;
tre[x].k=(t+num-1ll*num*t%mod+mod)%mod;
}
void push_up(int x)
{
tre[x].dat=(tre[ls].dat+tre[rs].dat)%mod;
tre[x].k=1ll*tre[ls].k*tre[rs].k%mod;
tre[x].b=(1ll*tre[rs].k*tre[ls].b+tre[rs].b)%mod;
tre[x].datk=(tre[ls].datk+1ll*tre[rs].datk*tre[ls].k)%mod;
tre[x].datb=(tre[ls].datb+1ll*tre[rs].datk*tre[ls].b+tre[rs].datb)%mod;
}
void insert(int x,int l,int r,int pos,int num)
{
if(l==r) return update(x,num),void();
int mid=(l+r)>>1;
if(pos<=mid) insert(ls,l,mid,pos,num);
else insert(rs,mid+1,r,pos,num);
push_up(x);
}
Segment_Tree query_seg(int x,int l,int r,int L,int R)
{
if(L<=l&&r<=R) return tre[x];
int mid=(l+r)>>1;
Segment_Tree ans1=(Segment_Tree){-1,0,0,0,0};
Segment_Tree ans2=(Segment_Tree){-1,0,0,0,0};
if(L<=mid) ans1=query_seg(ls,l,mid,L,R);
if(R>mid) ans2=query_seg(rs,mid+1,r,L,R);
if(~ans1.dat&&~ans2.dat)
return (Segment_Tree){(ans1.dat+ans2.dat)%mod,1ll*ans1.k*ans2.k%mod,(1ll*ans2.k*ans1.b+ans2.b)%mod,(ans1.datk+1ll*ans2.datk*ans1.k)%mod,(ans1.datb+1ll*ans2.datk*ans1.b+ans2.datb)%mod};
if(~ans1.dat) return ans1;
return ans2;
}
signed main()
{
task=read();
n=read(); q=read();
ta=read(); tb=read();
t=1ll*ta*inv(tb)%mod;
a=read(); b=read();
for(int i=1,pa,pb;i<=n;i++)
{
pa=read(); pb=read();
p[i]=1ll*pa*inv(pb)%mod;
insert(1,1,n,i,p[i]);
}
while(q--)
{
int opt,pos,pa,pb,l,r;
opt=read();
if(!opt)
{
pos=read(); pa=read(); pb=read();
p[pos]=1ll*pa*inv(pb)%mod;
insert(1,1,n,pos,p[pos]);
continue;
}
l=read(); r=read();
if(l==r){printf("%lld\n",1ll*(a+b)*p[l]%mod);continue;}
Segment_Tree temp=query_seg(1,1,n,l+1,r);
printf("%lld\n",(1ll*a*(1ll*temp.dat+p[l])%mod+1ll*(1ll*p[l]*temp.datk%mod+1ll*temp.datb+p[l])*b%mod)%mod);
}
return 0;
}

8.24考试总结(NOIP模拟47)[Prime·Sequence·Omeed]的更多相关文章

  1. 2021.5.24考试总结 [NOIP模拟3]

    带着爆0的心态考的试,没想到整了个假rk2 (炸鱼大佬wtz忒强了OTZ T1 景区路线规划 这题对刚学完概率期望的我来说简直水爆了好吗.. 因为存在时间限制,不好跑高斯消元,就直接跑dp就完了. 令 ...

  2. [考试总结]noip模拟47

    感觉自己放弃题目还是过于容易. 其实第一题不是很难,但是自己拿了一个暴力就走人了.. 然后其实简单优化一下子就有不少分数. 然后第二题的本质不同的子序列个数的方程没有推出来,如果推出来就会直接有 \( ...

  3. 6.17考试总结(NOIP模拟8)[星际旅行·砍树·超级树·求和]

    6.17考试总结(NOIP模拟8) 背景 考得不咋样,有一个非常遗憾的地方:最后一题少取膜了,\(100pts->40pts\),改了这么多年的错还是头一回看见以下的情景... T1星际旅行 前 ...

  4. 5.23考试总结(NOIP模拟2)

    5.23考试总结(NOIP模拟2) 洛谷题单 看第一题第一眼,不好打呀;看第一题样例又一眼,诶,我直接一手小阶乘走人 然后就急忙去干T2T3了 后来考完一看,只有\(T1\)骗到了\(15pts\)[ ...

  5. 5.22考试总结(NOIP模拟1)

    5.22考试总结(NOIP模拟1) 改题记录 T1 序列 题解 暴力思路很好想,分数也很好想\(QAQ\) (反正我只拿了5pts) 正解的话: 先用欧拉筛把1-n的素数筛出来 void get_Pr ...

  6. 2021.9.17考试总结[NOIP模拟55]

    有的考试表面上自称NOIP模拟,背地里却是绍兴一中NOI模拟 吓得我直接文件打错 T1 Skip 设状态$f_i$为最后一次选$i$在$i$时的最优解.有$f_i=max_{j<i}[f_j+a ...

  7. [考试总结]noip模拟23

    因为考试过多,所以学校的博客就暂时咕掉了,放到家里来写 不过话说,vscode的markdown编辑器还是真的很好用 先把 \(noip\) 模拟 \(23\) 的总结写了吧.. 俗话说:" ...

  8. Noip模拟47 2021.8.25

    期望得分:55+24+53 实际得分:0+0+3 乐死 累加变量清零了吗? 打出更高的部分分暴力删了吗? 样例解释换行你看见了吗? T1 Prime 打出55分做法没删原来的暴力,结果就轻松挂55分 ...

  9. 2021.9.13考试总结[NOIP模拟52]

    T1 路径 考虑每一位的贡献,第$i$位每$2^i$个数会变一次,那么答案为$\sum_{i=1}^{log_2n} \frac{n}{2^i}$. $code:$ 1 #include<bit ...

  10. 8.18考试总结[NOIP模拟43]

    又挂了$80$ 好气哦,但要保持优雅.(草 T1 地衣体 小小的贪心:每次肯定从深度较小的点向深度较大的点转移更优. 模拟一下,把边按链接点的子树最大深度排序,发现实际上只有上一个遍历到的点是对当前考 ...

随机推荐

  1. redis 简单整理——redis 的集合基本结构和命令[五]

    前言 简单介绍一下集合的基本结构和命令. 正文 集合(set)类型也是用来保存多个的字符串元素,但和列表类型不一 样的是,集合中不允许有重复元素,并且集合中的元素是无序的,不能通过 索引下标获取元素. ...

  2. 鸿蒙HarmonyOS实战-ArkUI组件(Tabs)

    一.Tabs Tabs组件是一种常见的用户界面(UI)组件,它是一个可以容纳多个选项卡的容器组件.每个选项卡通常包含一个面板和一个标签,用户可以通过点击标签来切换面板.Tabs组件通常用于展示多个相关 ...

  3. 通过一个非常简单的SSM项目来将SpringMVC配置整理清晰。

    所有的文件在Git上面都能找到,由于把代码搞上来看的很不舒服,结构不清晰. 第一步:确定环境 IDEA MySQL 5.7.19 Tomcat 9 Maven 3.6 第二步:创建数据库 参考GIT上 ...

  4. 力扣77(Java)-组合(中等)

    题目: 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合. 你可以按 任何顺序 返回答案. 示例 1: 输入:n = 4, k = 2输出:[ [2,4], [3,4], ...

  5. 媒体智能-淘宝直播流媒体互动实践 | D2 分享视频+文章

    背景:今天给大家带来的分享主题是<媒体智能-淘宝直播流媒体互动实践>,内容分为5个部分,首先看看在淘宝直播的直播间里主播可以怎样给用户拜年:然后具体讲如何制作一个手势拜年的特效:接着介绍我 ...

  6. 参与 Apache 顶级开源项目的 N 种方式,Apache Dubbo Samples SIG 成立!

    简介: 一说到参与开源项目贡献,一般大家的反应都是代码级别的贡献,总觉得我的代码被社区合并了,我才算一个贡献者,这是一个常见的错误认知.其实,在一个开源社区中有非常多的角色是 non-code con ...

  7. 一文理解 K8s 容器网络虚拟化

    简介:本文需要读者熟悉 Ethernet(以太网)的基本原理和 Linux 系统的基本网络命令,以及 TCP/IP 协议族并了解传统的网络模型和协议包的流转原理.文中涉及到 Linux 内核的具体实现 ...

  8. Apache Hudi 在 B 站构建实时数据湖的实践

    ​简介: B 站选择 Flink + Hudi 的数据湖技术方案,以及针对其做出的优化. 本文作者喻兆靖,介绍了为什么 B 站选择 Flink + Hudi 的数据湖技术方案,以及针对其做出的优化.主 ...

  9. OpenTK 垂直同步对刷新率的影响

    本文将和大家介绍 Vsync 垂直同步的开启对 OpenTK 应用的刷新率的影响 在上一篇博客 OpenTK 入门 初始化窗口 告诉了大家如何初始化 OpenTK 承载 OpenGL 的窗口的应用,在 ...

  10. dotnet C# 调用委托的 GetInvocationList 的对象分配

    本文也叫跟着 Stephen Toub 大佬学性能优化系列,这是我从 Stephen Toub 大佬给 WPF 框架做性能优化学到的知识,在热路径下,也就是频繁调用的模块,如果调用了委托的 GetIn ...