更好的阅读体验

我的博客观看

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的更多相关文章

  1. HGOI 20190519 题解

    脑补了一下今天的比赛难度和之前zju-lzw出的题目画风迥异. 难度完全不是一个水平的好伐. Probem A palindrome 给出一个$n$个元素的数组,可以任意指定一个数字$m$让所有$a_ ...

  2. HGOI 20181028 题解

    HGOI 20181028(复赛备考) /* 真是暴力的一天,最后一题MLE?由于数组开得太大了!!! 270滚粗 考场上好像智商高了很多?!(假的) */ sol:暴力求解,然后没有数据范围吐槽一下 ...

  3. HGOI NOIP模拟4 题解

    NOIP国庆模拟赛Day5 题解 T1 马里奥 题目描述 马里奥将要参加 NOIP 了,他现在在一片大陆上,这个大陆上有着许多浮空岛,并且其中一座浮空岛上有一个传送门,马里奥想要到达传送门从而前往 N ...

  4. HGOI 20191106

    HGOI 20191106 t1 旅行家(traveller) 2s,256MB [题目背景] 小X热爱旅行,他梦想有一天可以环游全世界-- [题目描述] 现在小X拥有n种一次性空间转移装置,每种装置 ...

  5. 「HGOI#2019.4.19省选模拟赛」赛后总结

    t1-Painting 这道题目比较简单,但是我比较弱就只是写了一个链表合并和区间DP. 别人的贪心吊打我的DP,嘤嘤嘤. #include <bits/stdc++.h> #define ...

  6. HGOI 20190407 Typing Competition Round #1 出题记

    /* ljc20020730出的HGOI20190407的模拟赛. 考试结果比预期难的不少,可能是由于本来计划5h的比赛打了4h吧. 就当普及组模拟赛好了... 难度大概4紫吧(弱省省选难度) 出境 ...

  7. HGOI 20190310 题解

    /* 又是又双叒叕WA的一天... 我太弱鸡了... 今天上午打了4道CF */ Problem 1 meaning 给出q组询问,求下列函数的值$ f(a) = \max\limits_{0 < ...

  8. [hgoi#2019/3/21]NOIP&NOI赛后总结

    前言 今天做的是是2010年提高组和NOI的题目,做过几道原题,但是还是爆炸了,我真的太弱了. t1-乌龟棋 https://www.luogu.org/problemnew/show/P1541 这 ...

  9. HGOI 20190303 题解

    /* 记一串数字真难. 5435 今天比赛又是hjcAK的一天. 今天开题顺序是312,在搞T1之前搞了T3 昨天某谷月赛真是毒瘤. 但是讲评的同学不错,起码T4看懂了... 构造最优状态然后DP的思 ...

随机推荐

  1. erlang工作前新手学习指引路线

    Erlang学习总结,新手指引 要具体的写erlang入门技术网上有非常多,我写的肯定没有那些大牛写的好,自己也实习了快一个月,也做一个总结,给后erlang初学兴趣者提供些拙见吧 第一步搭建学习环境 ...

  2. oracle 10g提升cluster失败

    一个今天升级10g集群环境到10.2.0.5.下载补丁p8202632_10205_Linux-x86-64.zip,解压安装并运行后.中途岛错误: I/O ERROR cannt reading o ...

  3. Method and apparatus for establishing IEEE 1588 clock synchronization across a network element comprising first and second cooperating smart interface converters wrapping the network element

    Apparatus for making legacy network elements transparent to IEEE 1588 Precision Time Protocol operat ...

  4. Adaptive device-initiated polling

    A method includes periodically sending a polling call to an enterprise system outside the firewall a ...

  5. WPF 获取鼠标屏幕位置、窗口位置、控件位置

    原文:WPF 获取鼠标屏幕位置.窗口位置.控件位置 public struct POINT { public int X; public int Y; public POINT(int x, int ...

  6. c#引用相等性比较(ReferenceEquals)

    Object.ReferenceEquals方法原型 public static bool ReferenceEquals( object objA, object objB) namespace T ...

  7. GFS读后笔记

    GFS读后笔记 Q&A 为什么存储三个副本?而不是两个或者四个? ANS: 可能取得某些平衡点 Chunk的大小为何选择64MB?这个选择主要基于哪些考虑? ANS: GFS主要支持appen ...

  8. 卷积、卷积矩阵(Convolution matrix)与核(Kernel)

    在图像处理领域,Kernel = convolution matrix = mask,它们一般都为一个较小的矩阵: 用于:Sharpen,Blur, Edge enhance,Edge detect, ...

  9. Dijkstra含权图最短路径;审判,不要错过枚举退款保证不会重复;国际象棋八皇后问题

    求两节点的最短通路.对于无权图,能够通过图的广度优先遍历求解.含权图一般通过Dijkstra算法求解. import java.util.ArrayList; import java.util.Has ...

  10. Angular常用指令

    安装Node 先去Node官网下载并安装Node.js Install the Angular CLI(安装Angular CLI) npm install -g @angular/cli Creat ...