牛客练习赛52-记录
正题
比赛链接:https://ac.nowcoder.com/acm/contest/1084#question
成绩
T1:T1:T1:数数
题目大意
给出nnn,求∑i=1n∑j=1n(i∗j)\sum_{i=1}^n \sum_{j=1}^n (i*j)i=1∑nj=1∑n(i∗j)
和
∏i=1n∏j=1n(i∗j)\prod_{i=1}^n\prod_{j=1}^n(i*j)i=1∏nj=1∏n(i∗j)
解题思路
第一个答案显然就是
(∑i=1ni)∗(∑j=1nj)(\sum_{i=1}^ni)*(\sum_{j=1}^n j)(i=1∑ni)∗(j=1∑nj)
等差数列求和即可O(1)O(1)O(1)解决。
第二个是
∏i=1ni2n⇒(∏i=1ni)2n\prod_{i=1}^ni^{2n} \Rightarrow\ (\prod_{i=1}^n i)^{2n}i=1∏ni2n⇒ (i=1∏ni)2n
预处理后O(logn)O(\log n)O(logn)回答。
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll XJQ=998244353;
ll t,n,s[10010000],sum;
ll power(ll x,ll b)
{ll ans=1;while(b){if(b&1) ans=ans*x%XJQ;x=x*x%XJQ;b>>=1;}return ans;
}
int main()
{scanf("%lld",&t);s[0]=1;for(ll i=1;i<=1e7;i++)s[i]=s[i-1]*i%XJQ;while(t--){scanf("%lld",&n);sum=((n+1)*n/2)%XJQ;printf("%lld %lld\n",sum*sum%XJQ,power(s[n],2*n));}
}
T2:GalahadT2:GalahadT2:Galahad
题目大意
一个长度为nnn的序列,求[l,r][l,r][l,r]这个区间的和,需要注意的是若一个数出现多次的话只计算一次。
解题思路
莫队会T\color{red}\texttt{\huge莫队会T}莫队会T
我们先将询问按照右端点单调不降排序,然后我们用指针进行扫描。
现在我们不需要考虑右端点了,只需要在已有的数中每次询问一个左端点。
我们考虑如何计算,因为不能重复,我们可以对于每个数计算出一个可以影响的范围,也就是最右边的那个数。
我们现在得出一种算法,我们每次右端点移动时加入一个数,若这个数之前没有就直接在树状数组上加入,否则就将前面的那个赋值为0后再进行加入。
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
#define lowbit(x) (x&-x)
#define ll long long
using namespace std;
const ll N=5e5+100;
struct node{ll l,r,id;
}a[N];
ll n,m,w[N],t[N],ans[N],v[N],sum;
void change(ll x,ll z)
{while(x<=n){t[x]+=z;x+=lowbit(x);}
}
ll ask(ll x)
{ll ans=0;while(x){ans+=t[x];x-=lowbit(x);}return ans;
}
bool cMp(node x,node y)
{return x.r<y.r;}
int main()
{scanf("%lld%lld",&n,&m);for(ll i=1;i<=n;i++)scanf("%lld",&w[i]);for(ll i=1;i<=m;i++)scanf("%lld%lld",&a[i].l,&a[i].r),a[i].id=i;sort(a+1,a+1+m,cMp);ll tail=1;for(ll i=1;i<=m;i++){while(tail<=a[i].r){if(v[w[tail]]) change(v[w[tail]],-w[tail]);else sum+=w[tail];v[w[tail]]=tail;change(tail,w[tail]);tail++;}ans[a[i].id]=sum-ask(a[i].l-1);}for(ll i=1;i<=m;i++)printf("%lld\n",ans[i]);
}
T3:T3:T3:烹饪
题目大意
nnn个数的序列aaa,在其中选出若干个组成无序序列bbb。使得N+∈∑(bi∗ki)\mathbb{N}^+\in \sum (b_i*k_i)N+∈∑(bi∗ki)
kik_iki为任意整数。
求有多少种选择方案数。
解题思路
根据裴蜀定理,我们有ax+by=gcd(a,b)ax+by=gcd(a,b)ax+by=gcd(a,b),若gcd(a,b)=1gcd(a,b)=1gcd(a,b)=1那么就可以变成任意正整数。我们可以将其扩展到多元。
gcd(a,b)x+cy=gcd(a,b,c)⇒ax+by+cz=gcd(a,b,c)gcd(a,b)x+cy=gcd(a,b,c)\Rightarrow ax+by+cz=gcd(a,b,c)gcd(a,b)x+cy=gcd(a,b,c)⇒ax+by+cz=gcd(a,b,c)
以此类推我们可以得出若我们选择的无序序列bbb的gcd=1gcd=1gcd=1那么就满足条件。
我们依次设立dpdpdp,设fi,jf_{i,j}fi,j表示到第iii个,gcdgcdgcd之和为jjj时的方案数。我们有
fi,gcd(i,j)=∑fi−1,jf_{i,gcd(i,j)}=\sum f_{i-1,j}fi,gcd(i,j)=∑fi−1,j
这里我们倒过来转移即可,下面的代码是滚动了的。
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll XJQ=998244353;
ll n,num,f[2100];
ll power(ll x,ll b)
{ll ans=1;while(b){if(b&1) ans=ans*x%XJQ;x=x*x%XJQ;b>>=1;}return ans;
}
int main()
{scanf("%lld",&n);for(ll i=1;i<=n;i++){scanf("%lld",&num);f[num]=(f[num]+1)%XJQ;for(ll j=1;j<=2000;j++)(f[__gcd(j,num)]+=f[j])%=XJQ;}printf("%lld",(f[1]*power(2,XJQ-2))%XJQ);
}
T4:T4:T4:粉丝群
题目大意
求有多少个nnn个数的序列满足以下条件
- 和为2n2n2n且每个数不小于1
- 任意一个子集的和不为nnn
求有多少个,和字典序第kkk小的方案的异或和。
解题思路
结论题,打表找一下就好了。
我们会发现方案数是n−1n-1n−1个111和一个n+1n+1n+1,还有若是奇数的话还有一个全是222的方案。
证明一下(十分感性),此时我们有一个长度为序列nnn,此时对于每个1≤ai≤n1\leq a_i\leq n1≤ai≤n。
那么我们发现若一个数为2+k2+k2+k那么至少就会有kkk个数为111,假设最终能组成nnn的有lll个数那么有
2l+∑i=1lki=n−z(z∈[0,∑i=1lk])2l+\sum_{i=1}^l k_i=n-z(z\in [0,\sum_{i=1}^l k])2l+i=1∑lki=n−z(z∈[0,i=1∑lk])
⇒∑i=1lki≥n−2l−∑i=1lk\Rightarrow \sum_{i=1}^l k_i\geq n-2l-\sum_{i=1}^l k⇒i=1∑lki≥n−2l−i=1∑lk且∑i=1lki≤n−2l\sum_{i=1}^l k_i\leq n-2li=1∑lki≤n−2l
显然此时对于任意∑i=1lki>0\sum_{i=1}^l k_i>0∑i=1lki>0都有解
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
ll n,k;
int main()
{scanf("%lld%lld",&n,&k);printf("%lld\n",n+(n&1)-(n==1));if(n&1) printf("%lld",(k==n)?2:(n+1));else printf("%lld",(n+1)^1);
}
牛客练习赛52-记录相关推荐
- 牛客练习赛52 | C | [烹饪] (DP,裴蜀定理,gcd)
牛客练习赛52 C 烹饪 链接:https://ac.nowcoder.com/acm/contest/1084/C来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 327 ...
- 牛客练习赛52 B.Galahad (树状数组)
B.Galahad 链接:https://ac.nowcoder.com/acm/contest/1084/B 来源:牛客网 题目描述 魔女要测试骑士的能力,要求他维护一个长度为 的序列,每次要询问一 ...
- 牛客练习赛52.Galahad(树状数组维护区间不相同数的和)
链接:https://ac.nowcoder.com/acm/contest/1084/B 来源:牛客网 Galahad 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K ...
- 牛客练习赛52 B:Galahad(树状数组维护区间不同元素和(个数))
[题目] 查询区间和,如果区间元素重复出现则计数一次. [题解] 按区间的右端点建立树状数组,维护区间[1,R]的每个元素的最右位置.按查询区间的右端点排序,依次处理,每次更新当前值的最右位置即可. ...
- 牛客练习赛52 B Galahad (树状数组)
题目链接:https://ac.nowcoder.com/acm/contest/1084/B 题意 5e5的区间,5e5个询求[l,r]区间内出现过的数的和 思路 1s时限,莫队显然会T 我们可以将 ...
- 牛客练习赛52 BGalahad 树状数组
传送门 题意: 求一个区间的和,但如果某一个数在这个区间出现了多次,这个数只能被计算一次. 官方题解:按右端点从小到大排序.建立树状数组ccc,维护贡献的前缀和. 由于权值ai 满足1≤ai≤500 ...
- 牛客练习赛81 E. 小 Q 与函数求和 1( “简单莫比乌斯反演” ,欧拉函数性质)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 牛客练习赛81 E. 小 Q 与函数求和 1( "简单莫比乌斯反演" ) Prob ...
- 解题报告(一)C、(牛客练习赛41 F)简单数学题(数论 + FWT)(3.5)
繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...
- 牛客练习赛34 E little w and Digital Root(数位dp)
title: 牛客练习赛34 E little w and Digital Root(数位dp) date: 2018-12-17 22:38:37 tags: 数位dp categories:ACM ...
- 牛客练习赛34 - C little w and Segment Coverage(思维、树状数组)
title: 牛客练习赛34 - C little w and Segment Coverage(思维.树状数组) date: 2018-12-15 16:36:55 tags: [树状数组,思维] ...
最新文章
- mongodb基础应用
- 基于WebSocket实现聊天室(Node)
- J - One-Dimensional HYSBZ - 4688
- Selenium常用方法及函数
- 按钮随复选框选中与取消变换样式
- safari图片跨域
- 数论:扩展欧几里德(洛谷P1516 青蛙的约会)
- LeetCode 30. 串联所有单词的子串(字符串哈希)
- 论文浅尝 | WWW2022 - “知识提示”之知识约束预训练微调
- 计算机网络运输层习题5-17
- Java数据库表自动转化为PO对象
- Java byte变成无符号整数~~~
- python selenium文件下载
- JEECG登陆全过程
- Unity3D标准资源包下载与使用
- solidity投票(ballot)合约
- vs2019开发android so库
- 老闪创业那些事儿(14)——测试老白变身记
- EF框架(一)搭建过程
- 增加mysql表一个字段+注释
热门文章
- ios把数据传递到另一个页面_iOS 委托 页面之间传递数值
- filesystemwatch java_C#方法的委托和java中的回调
- canvas 实现图片局部模糊_Canvas模糊化处理图片、毛玻璃处理图片之stackblur.js
- 算法设计与分析——递归与分治策略——棋盘覆盖
- 蓝桥杯-卡片-填空题
- spring boot 中@Mapper和@Repository的区别
- pc 图片预览放大 端vue_安利一款简单好用的Vue图片预览插件
- hdu2602 Bone Collector-01背包问题
- [NOIP2008 提高组] 笨小猴-map容器用来标记
- android应用窗口模式,[技巧]如何启用Android N开发者预览版中的“自由窗口”模式...