noip模拟7

news/2024/11/6 18:02:02/文章来源:https://www.cnblogs.com/ccjjxx/p/18530685

新的阶乘

考虑从这个式子下手,怎么更优秀的求得答案。

\[\begin{aligned} f(x)&=x_1\times(x-1)^2\times(x-2)^3...2^{x-1}\times 1^x \\ &=\prod_{k=0}^{x-1}(x-k)^{k+1} \\ &=x!\times \prod_{k=0}^{x-2}(x-1-k)^{k+1} \\ &=x!\times f(x-1) \\ &=\prod_{k=1}^x k! \\ &=\prod_{k=1}^x k^{x-k+1} \end{aligned} \]

那么我们只需要考虑对于区间 \([1,n]\) 内的所有数,一个数的贡献就是质因数的个数 \(+x-k+1\)

如果从每个数开始进行质因数分解,时间复杂度是 \(O(n\sqrt{n})\),不能接受啊。

那么我们可以仿照埃筛的思想,对于每个质数,找到它的所有倍数,对那个数进行贡献,那思路就非常清晰了。

因为会有多个同样质因数的情况,所以需要对枚举的倍数进行拆分。

总时间复杂度约为 \(O(n\log n \log \log n)\)

能过反正。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n;
const int N=1e7+7;
int ans[N];
bitset<N>vis;
void calc()
{for(int i=2;i<=n;i++){if(!vis[i]){for(int j=1;j*i<=n;j++){vis[j*i]=1;int k=j*i;while(k%i==0) ans[i]+=(n-(j*i)+1),k/=i;}}}
}
void write(int x)
{if(x>9) write(x/10);putchar(x%10+'0');
}
signed main()
{freopen("factorial.in","r",stdin);freopen("factorial.out","w",stdout);scanf("%lld",&n);calc();int flag=0;printf("f(%lld)=",n);for(int i=1;i<=n;i++){if(ans[i]==0) continue;if(flag)putchar('*');if(ans[i]==1) write(i);else write(i),putchar('^'),write(ans[i]);flag=1;}return 0;
}

博弈树

结论题。

如果在直径中点那么 \(Bob\) 获胜,否则 \(Alice\) 获胜。

点击查看代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5;
int head[N],ecnt{};
struct EDGE{int nxt,to;
}e[N<<2];
inline void add(int u,int v)
{e[++ecnt].nxt=head[u];head[u]=ecnt;e[ecnt].to=v;
}
int f[N],d[N];
int maxval{},maxpos;
inline void dfs1(int u,int fa)
{f[u]=fa,d[u]=d[fa] + 1;if(d[u]>maxval) maxval=d[u],maxpos=u;for(int i=head[u];i;i=e[i].nxt){int v=e[i].to;if(v==fa) continue;dfs1(v,u);}
}
int dfn[N],cnt{};
inline void dfs2(int u,int fa)
{if(fa==0) maxval=fa;f[u]=fa,d[u]=d[fa]+1;dfn[u]=++cnt;if(d[u]>maxval) maxval=d[u],maxpos=u;for(int i=head[u];i;i=e[i].nxt){int v=e[i].to;if(v==fa) continue;dfs2(v,u);}
}
vector<int>zj;
bool fnd=0;
inline void dfs3(int u,int fa)
{if(u==maxpos){fnd=1;zj.push_back(u);return;}for(int i=head[u];i;i=e[i].nxt){int v=e[i].to;if(v==fa) continue;dfs3(v,u);if(fnd) {zj.push_back(u);return;}}
}
signed main()
{freopen("tree.in","r",stdin);freopen("tree.out","w",stdout);int n,q;cin>>n>>q;for(int i=1;i<n;i++){int u,v;cin>>u>>v; add(u,v),add(v,u);}dfs1(1,0);int rt=maxpos;dfs2(rt,0),dfs3(rt,0);int siz=zj.size();int pos=0;if(siz%2==1) pos=zj.at(siz>>1);while(q--){int u;cin>>u;if(pos==u) puts("Bob");else puts("Alice");}return 0;
}

划分

其实很简单。我们考虑分两种情况讨论。

第一种是题目给的特殊性质,满足 \(\forall i\in [1,k],a_i=0\)。这种情况就是前 \(m\) 个空,\(m\ge k\),能插最多 \(k\) 个板,那么划分成 \(k\) 段的方案数就是 \(\displaystyle\binom{m}{k-1}\)

但是题目上说可以划分成大于等于 \(k\) 段,那总方案数就是 \(\displaystyle\sum_{i=k-1}^{m}\binom{m}{i}\)

另一种情况,我们想到之前那个划分线段集合的题。那道题有一个贪心策略就是找 \(k-1\) 个单个的线段去确保答案最大。而这道题可以沿用这种策略。考虑选取一个长度为 \(n-k+1\) 的字典序最大的段,因为要保证最大的数的位数最多,这样才能使答案最大。其他 \(k-1\) 段就是单个的点。

然后,考虑到一个二进制数的最后一位可以更改,那么我们只需要使用哈希去匹配有多少长度为 \(n-k\) 的子串是和最大答案相匹配的,统计即为答案。

题目里有 hack 数据,你需要找一个较为优秀的模数去双哈希,要不然会有一个点卡住。

考虑有边界情况 \(n=k\),这时候答案是 \(\displaystyle \sum_{k=1}^n[a_i=1]\),方案数为 \(1\)

顺便拿了最优解

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,k;
const int N=2e6+5;
char c[N];
const int mod=998244353;
int mx=0;
int ppow(int a,int b)
{int res=1;while(b){if(b&1) res=(res*a)%mod;a=(a*a)%mod,b>>=1;}return res;
}
int f[N],g[N];
void init()
{f[0]=g[0]=1;for(int i=1;i<=n;i++)f[i]=(f[i-1]*i)%mod;g[n]=ppow(f[n],mod-2);for(int i=n-1;i>=1;i--)g[i]=(g[i+1]%mod*(i+1)%mod);
}
int getc(int a,int b)
{return f[a]*g[a-b]%mod*g[b]%mod;
}
#define ull unsigned long long
ull p=13331,p1=1313131;
const ull md=20091119;
ull hs[N],pp[N];
ull hs1[N],pp1[N];
signed main()
{
//	freopen("C-ex-2.in","r",stdin);freopen("divide.in","r",stdin);freopen("divide.out","w",stdout);ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);cin>>n>>k;cin>>(c+1);if(n==k){int ccnt=0;for(int i=1;i<=n;i++) ccnt+=(c[i]=='1');return cout<<ccnt<<" 1",0;}bool _=1;for(int i=1;i<=k;i++) _&=(c[i]=='0');if(_){int ans=0;for(int i=k+1;i<=n;i++) ans=((ans*2ll)%mod+c[i]-'0')%mod;init();int ans2=0,cnt=0;for(int i=1;i<=n;i++){if(c[i]=='1')break;++cnt;}if(cnt==n)--cnt;for(int i=k-1;i<=cnt;i++)ans2=(ans2+getc(cnt,i))%mod;cout<<ans%mod<<" "<<ans2%mod<<"\n";return 0;}int len=n-k+1;int mxpos=1;for(int i=1;i+len-1<=n;i++){int j=i+len-1;int now=mxpos-1;bool flag=0;for(int k=i;k<=j;k++){now++;if(c[k]==c[now])continue;if(c[k]>c[now]) {flag=1;break;}else break;}if(flag) mxpos=i;}
//	cout<<mxpos;int ans1=0;for(int i=mxpos;i<=mxpos+len-1;i++)	ans1=(ans1*2)%mod+c[i]-'0';for(int i=1;i<mxpos;i++) ans1=(ans1+c[i]-'0')%mod;for(int i=mxpos+len;i<=n;i++) ans1=(ans1+c[i]-'0')%mod;cout<<ans1<<" ";ull cmp=0,cmp1=0;pp[0]=1,pp1[0]=1;for(int i=1;i<=n;i++){hs[i]=hs[i-1]*p+(int)c[i];pp[i]=pp[i-1]*p;hs1[i]=hs1[i-1]*p1%md+(int)c[i];hs1[i]%=md;pp1[i]=pp1[i-1]*p1%md;}int ans2=0;for(int i=mxpos;i<mxpos+len-1;i++) cmp=cmp*p+(int)c[i];for(int i=mxpos;i<mxpos+len-1;i++) cmp1=cmp1*p1%md+(int)c[i],cmp1%=md;cmp1%=md;for(int i=1;i+len-1<=n;i++){ull now=hs[i+len-2]-hs[i-1]*pp[len-1];ull now2=((hs1[i+len-2]-hs1[i-1]*pp1[len-1]%md+md)%md+md)%md;if(now==cmp&&now2==cmp1)++ans2,ans2%=mod;}cout<<ans2;return 0;
}
/*
21 3
1001010101010111001111110 6
0000000000*/

灯笼

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

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

相关文章

chapter15

relocation.py参数第一题问题用种子 1、2 和 3 运行,并计算进程生成的每个虚拟地址是处于界限内还是界限外?如果在界限内,请计算地址转换。 种子为1时:种子为2时:种子为3时:第二题问题使用以下标志运行:-s 0 -n 10。为了确保所有生成的虚拟地址都处于边界内,要将-l(界…

23设计模式详解

参考博客 https://baijiahao.baidu.com/s?id=1758410771062793648&wfr=spider&for=pc 设计模式(Design pattern) """ 对软件开发中【普遍存在(反复出现)的问题】,而提出的【解决方案】。每一个设计模式系统地命名、解释和评价了面向对象系统中一…

DearPyGui环境配置

DearPyGui 是一个基于Python的图形用户界面(GUI)工具包,它以简单易用而著称。这个库利用GPU加速渲染和高效的C/C++底层代码,确保了出色的性能和稳定性。DearPyGui支持异步函数,能够绘制大量数据点而不影响帧率,还内置了一个节点编辑器和实时开发调试工具。它适用于Window…

oasys系统代码审计

oasys是一个OA办公自动化系统,使用Maven进行项目管理,基于springboot框架开发的项目,mysql底层数据库,前端采用freemarker模板引擎,Bootstrap作为前端UI框架,集成了jpa、mybatis等框架。简述: oasys是一个OA办公自动化系统,使用Maven进行项目管理,基于springboot框架开…

科大讯飞离线lunix tts demo使用

项目中需要用到后台服务端用文本生成语音,网上大部分都是通过ai大模型推理出来的,还有写其他方式的,效果和生成时间都比较不理想,但是讯飞生成的只需要零点几秒,不愧是行业NO1,下面说下怎么使用。 1、下载官方demo。 2、在官方demo目录下,执行source 32bit_make.sh 或64…

高效数据集成:从旺店通到金蝶云

旺店通旗舰奇门数据集成到金蝶云星空:柏为销售出库单07.25 在现代企业的运营中,数据的高效流转和准确对接是确保业务顺畅运行的关键。本文将分享一个实际案例——如何通过轻易云数据集成平台,将旺店通旗舰奇门的数据无缝集成到金蝶云星空系统中。具体方案名称为“柏为销售出…

对比山海鲸报表和Tableau,哪款报表软件更好用?

在数据分析和报表制作的领域,企业往往面临着选择合适工具的难题。尤其是当市场上有很多功能强大的工具时,如何从中挑选出最适合自己需求的报表软件成为了一个关键问题。今天,我们将对比两款报表工具——山海鲸报表和Tableau,看看它们各自的特点和优势,帮助你做出明智的选择…

团子东子开奖了,这泼天的富贵!

秋招已经接近尾声了,最近各家公司的薪资也陆续公布了,今天在逛某客时,被一个 25 届 C9 硕的薪资羡慕到了,一起来感受下这泼天的富贵吧。 这个同学今年秋招总共拿到了 3 个 Offer,分别是:小米:28K*15,总包 45W,sp,北京。 美团:30K*15.5,总包 47W,sp,上海。 京东:…

odoo中对多条数据按条件进行分类汇总 read_group的用法总结并抽取出公式

今天在工作中遇到一个这样的问题。要求:做一个打印模板实现下面图中的分类汇总 py3o://for="o in object.delivery_containers_line.read_group(domain=[(delivery_order_id,=,object.id)], fields=[customer_id, delivery_order_id, sales_order_id, supplier_id,purcha…

百万年薪!2024 Salesforce高薪职位排行

随着Salesforce在全球的普及,这一平台不仅带来了新的职场机会,更为从业者提供了优渥的薪资待遇。 最近的Salesforce薪资调查显示,Salesforce生态系统中不同职位的薪资水平相当可观,尤其在美国市场,一些顶级岗位的年薪可达到令人惊叹的百万级别。今天我们就来细数2024年Sal…

初识AI大模型,ollama使用,llama factory大模型微调,lama.cpp模型转换guff

最近了解了下生成式AI对话,下面是自己的一些尝试记录。ollama 安装及使用1、安装我是在windows环境下安装的,很简单,访问:https://ollama.com/ ,下载windows安装包,打开安装就行了。cmd输入ollama -v检验是否安装成功。2、配置在环境变量的用户变量中加入如下几个:   …

zlibrary中文版入口及电子书客户端/app(2024更新)

Z-library是一个全球范围内庞大的数字图书馆之一,其藏书量非常丰富。截至最新数据,Z-library共收录了超过9,826,996册电子书以及84,837,646篇学术期刊文章。这个数字图书馆覆盖了从经典文学巨著到前沿理工学科,从人文艺术瑰宝到专业学术论文的广泛领域,几乎能够满足每一位求…