hgoi#20190519
更好的阅读体验
来我的博客观看
T1-求余问题
Abu Tahun很喜欢回文。
一个数组若是回文的,那么它从前往后读和从后往前读都是一样的,比如数组{1},{1,1,1},{1,2,1},{1,3,2,3,1}
都是回文数组,但是数组{11,3,5,11},{1,12}
不是回文的。
Abu Tahun有个包含n个整数的数组A,他想让它变成回文的。他可以任意选择一个整数m,然后让所有元素Ai变成Ai mod m。
求最大的m的值。
解法
显然,需要满足
a[1]===a[n](mod m)
a[2]===a[n-1](mod m)
......
则一定有最大的m为gcd(a[1]-a[n],a[2]-a[n-1],......)
ac代码
#include<bits/stdc++.h>
using namespace std;
int gcd(int a,int b){return b==0?a:gcd(b,a%b);}
int n,a[100010],ans=0;
int main()
{
freopen("palindrome.in","r",stdin),freopen("palindrome.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<=n/2;i++)ans=gcd(ans,abs(a[i]-a[n-i+1]));
if(ans)printf("%d\n",ans);else puts("-1");
return 0;
}
T2-阶乘数组
你正在做“机器学习”研究,作为机器学习教育的一部分,你必须先学习组合数学。在老师给你讲了为什么组合数学里,到处会出现“阶乘!”后,你需要挑战下面这个问题:
给定一个数组\(A = [A_1,A_2,\dots,A_n]\),长度是n,你需要完成m次操作,操作有3种:
1、给定闭区间\([l, r]\),为区间内的所有数增加1
2、给定闭区间\([l, r]\),计算\(\sum_{i=l}^r A_i!\ mod\ 10^9\)
3、给位置i和数值v,将第i个数变成v
解法
因为是mod 1e9,所以40! mod 1e9就是0了
显然是个线段树,标算是对于线段树上的每一个节点,存一个数组,cnt[i]表示这一区间i的数量有多少个
这个做法的复杂度就是40*nlogn
,虽然能过,但是代码很长,关键是我打炸了(大雾
还有一种做法,暴力维护,每次单点修是logn,查询是logn,区间修改暴力一下
有人会说:这不就n方了吗
所以需要优化,因为一个点最多进行40次区间修,所以维护一个标记,标记一个区间是否全部大于40
然后复杂度是一样的,但是连懒标记都不用打唉,还能爆踩标算有木有捏QAQ
ac代码
#include<bits/stdc++.h>
#define mod 1000000000
#define ls (nw*2)
#define rs (nw*2+1)
#define mid ((l+r)>>1)
using namespace std;
int n,m,opt,x,y,g[40]={1},a[400010],t[400010],tag[400010];
void pushup(int nw){a[nw]=(a[ls]+a[rs])%mod,tag[nw]=tag[ls]&tag[rs];}
void build(int nw,int l,int r)
{
if(l==r){scanf("%d",&t[nw]);if(t[nw]>=40)tag[nw]=1;else a[nw]=g[t[nw]];return;}
build(ls,l,mid),build(rs,mid+1,r),pushup(nw);
}
void modify(int nw,int l,int r,int ql,int qr)
{
if(tag[nw])return;
if(l==r){t[nw]++;if(t[nw]>=40)a[nw]=0,tag[nw]=1;else a[nw]=g[t[nw]];return;}
if(ql<=mid)modify(ls,l,mid,ql,qr);
if(qr>mid)modify(rs,mid+1,r,ql,qr);
pushup(nw);
}
void update(int nw,int l,int r,int q,int v)
{
if(l==r){t[nw]=v;if(t[nw]>=40)a[nw]=0,tag[nw]=1;else a[nw]=g[t[nw]],tag[nw]=0;return;}
if(q<=mid)update(ls,l,mid,q,v);else update(rs,mid+1,r,q,v);
pushup(nw);
}
int query(int nw,int l,int r,int ql,int qr)
{
if(ql<=l&&r<=qr)return a[nw];
if(qr<=mid)return query(ls,l,mid,ql,qr);
if(ql>mid)return query(rs,mid+1,r,ql,qr);
return (query(ls,l,mid,ql,qr)+query(rs,mid+1,r,ql,qr))%mod;
}
int main()
{
freopen("factorial.in","r",stdin),freopen("factorial.out","w",stdout);
for(int i=1;i<=39;i++)g[i]=(1ll*g[i-1]*i)%mod;
scanf("%d%d",&n,&m),build(1,1,n);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&opt,&x,&y);
if(opt==1)modify(1,1,n,x,y);
if(opt==2)printf("%d\n",query(1,1,n,x,y));
if(opt==3)update(1,1,n,x,y);
}
return 0;
}
T3-直角三角形
四个直角三角形(9,12,15),(12,16,20),(5,12,13),(12,35,37)
较特殊的地方是它们的边长都是整数,而且其中一条直角边边长都是12。可以证明,边长都是整数且其中一条直角边边长是12的直角三角形就这四个。
找到最小的整数x,使得直角三角形的边长都为整数的情况下,包含直角边长为x的直角三角形个数恰好是n个。
解法
首先我们需要找到根据x求n的方法
\(x^2+y^2=z^2->x^2=z^2-y^2->x^2=(z+y)*(z-y)->x^2=uv(u=z+y,v=z-y)->z=(u+v)/2,y=(u-v)/2\)
所以每一对\((u,v)\)只要满足\(uv=x^2\)并且\(u!=v\)并且\(u===v(mod\ 2)\)就是一组解
具体的,对于\(x=2^a3^b5^c7^d\dots\),方案数就是\([(2a-1)(2b+1)(2c+1)(2d+1)\dots-1]/2\)
那知道n怎么求最小的x呢,考虑dp,枚举每个质数的指数,然后转移时先不管特殊的2
ac代码
#include<bits/stdc++.h>
#define ll long long
#define lima 2000010
#define limb 10000000000000000
using namespace std;
void get(ll &x, ll y){if(x==0)x=y;else x=min(x,y);}
int n,q,prime[20]={14,2,3,5,7,11,13,17,19,23,29,31,33,37,41};
ll dp[lima],p=1,ans;
int main()
{
freopen("triangle.in","r",stdin),freopen("triangle.out","w",stdout);
dp[1]=1,scanf("%d",&n);
for(int i=2;i<=prime[0];i++)for(int j=lima;j>=1;j--,p=1)
{
if(!dp[j])continue;
for(int k=1;;k++)
{
p=1ll*p*prime[i];
if(1ll*j*(k*2+1)>lima||1ll*dp[j]*p>limb)break;
get(dp[j*(k*2+1)],1ll*dp[j]*p);
}
}
while(n--)
{
scanf("%d",&q),q=q*2+1,ans=(dp[q]?dp[q]:limb+1);
for(int k=1;;k++)
{
if((1ll<<k)>limb)break;
if(q%(2*k-1))continue;
if(dp[q/(2*k-1)]&&1ll*dp[q/(2*k-1)]<limb/(1ll<<k))
ans=min(ans,1ll*dp[q/(2*k-1)]*(1ll<<k));
}
printf("%lld\n",ans>limb?-1:ans);
}
return 0;
}
hgoi#20190519的更多相关文章
- HGOI 20190519 题解
脑补了一下今天的比赛难度和之前zju-lzw出的题目画风迥异. 难度完全不是一个水平的好伐. Probem A palindrome 给出一个$n$个元素的数组,可以任意指定一个数字$m$让所有$a_ ...
- HGOI 20181028 题解
HGOI 20181028(复赛备考) /* 真是暴力的一天,最后一题MLE?由于数组开得太大了!!! 270滚粗 考场上好像智商高了很多?!(假的) */ sol:暴力求解,然后没有数据范围吐槽一下 ...
- HGOI NOIP模拟4 题解
NOIP国庆模拟赛Day5 题解 T1 马里奥 题目描述 马里奥将要参加 NOIP 了,他现在在一片大陆上,这个大陆上有着许多浮空岛,并且其中一座浮空岛上有一个传送门,马里奥想要到达传送门从而前往 N ...
- HGOI 20191106
HGOI 20191106 t1 旅行家(traveller) 2s,256MB [题目背景] 小X热爱旅行,他梦想有一天可以环游全世界-- [题目描述] 现在小X拥有n种一次性空间转移装置,每种装置 ...
- 「HGOI#2019.4.19省选模拟赛」赛后总结
t1-Painting 这道题目比较简单,但是我比较弱就只是写了一个链表合并和区间DP. 别人的贪心吊打我的DP,嘤嘤嘤. #include <bits/stdc++.h> #define ...
- HGOI 20190407 Typing Competition Round #1 出题记
/* ljc20020730出的HGOI20190407的模拟赛. 考试结果比预期难的不少,可能是由于本来计划5h的比赛打了4h吧. 就当普及组模拟赛好了... 难度大概4紫吧(弱省省选难度) 出境 ...
- HGOI 20190310 题解
/* 又是又双叒叕WA的一天... 我太弱鸡了... 今天上午打了4道CF */ Problem 1 meaning 给出q组询问,求下列函数的值$ f(a) = \max\limits_{0 < ...
- [hgoi#2019/3/21]NOIP&NOI赛后总结
前言 今天做的是是2010年提高组和NOI的题目,做过几道原题,但是还是爆炸了,我真的太弱了. t1-乌龟棋 https://www.luogu.org/problemnew/show/P1541 这 ...
- HGOI 20190303 题解
/* 记一串数字真难. 5435 今天比赛又是hjcAK的一天. 今天开题顺序是312,在搞T1之前搞了T3 昨天某谷月赛真是毒瘤. 但是讲评的同学不错,起码T4看懂了... 构造最优状态然后DP的思 ...
随机推荐
- net平台的rabbitmq
net平台的rabbitmq使用封装 前言 RabbitMq大家再熟悉不过,这篇文章主要整对rabbitmq学习后封装RabbitMQ.Client的一个分享.文章最后,我会把封装组件和demo奉上. ...
- 《Java并发编程实战》第十二章 测试并发程序 读书笔记
并发测试分为两类:安全性测试(无论错误的行为不会发生)而活性测试(会发生). 安全測试 - 通常採用測试不变性条件的形式,即推断某个类的行为是否与其它规范保持一致. 活跃性測试 - 包含进展測试和无进 ...
- 面试问题:Vista与XP的Session 0与Session X的区别
面试问题:Vista与XP的Session 0与Session X的区别 在XXXXX的一次面试中,笔试问题的题目曾提到Session 0.Session 1在Vista和Xp中的区别?现在把答案发上 ...
- PLC中ST语言的几种程序流程控制语句
ST语言是IEC61131-3中规定的5中标准语言之一,目前常用见品牌的PLC都支持这种语言(施耐德,AB可以直接选择创建该类型的程序段或者功能块,西门子的略微麻烦一点),ST语言的一个好处是移植性好 ...
- 第一次react-native项目实践要点总结 good
今天完成了我的第一个react-native项目的封包,当然其间各种环境各种坑,同时,成就感也是满满的.这里总结一下使用react-native的一些入门级重要点(不涉及环境).注意:阅读需要语法基础 ...
- vcmi(魔法门英雄无敌3 - 开源复刻版) 源码编译
vcmi源码编译 windows+cmake+mingw ##1 准备 HoMM3 gog.com CMake 官网 vcmi 源码 下载 QT5 with mingw 官网 Boost 源码1.55 ...
- 监听WPF依赖属性
原文:监听WPF依赖属性 当我们使用依赖属性的时候,有时需要监听它的变化,这在写自定义控件的时候十分有用, 下面介绍一种简单的方法. 如下使用DependencyPropertyDescripto ...
- 移动端--web开展
近期看到群里对关于 移动端 web开发非常是感兴趣.决定写一个关于 移动端的web开发 概念或框架(宝庆对此非常是纠结).也是由于自己一直从事pc 浏览器 web一直对 移动端的不是非常重视,所以趁此 ...
- WPF字体图标——IconFont
原文:WPF字体图标--IconFont 版权声明:本文为[CSDN博主:松一160]原创文章,未经允许不得转载. https://blog.csdn.net/songyi160/article/de ...
- 简化网站开发:SiteMesh小工具
在一个站点的制备,几乎所有的页面将具有相同的部分.导航栏例如,顶,每一页都是一样的,在底部的版权声明,每一页还都是一样的. 因此,在顶部导航栏的准备.第一种方法是直接复制的所有导航栏的代码,这种方法是 ...