NOIP2018 集训(二)
A题 神炎皇
问题描述
神炎皇乌利亚很喜欢数对,他想找到神奇的数对。
对于一个整数对 \((a,b)\) ,若满足 \(a+b\leq n\) 且 \(a+b\) 是 \(ab\) 的因子,则称
为神奇的数对。请问这样的数对共有多少呢?
输入格式
一行一个整数 \(n\) 。
输出格式
一行一个整数表示答案,保证不超过 \(64\) 位整数范围。
数据范围与约定
对于 \(20\%\) 的数据 \(n\leq 1000\) ;
对于 \(40\%\) 的数据 \(n\leq 10^5\) ;
对于 \(60\%\) 的数据 \(n\leq 10^7\) ;
对于 \(80\%\) 的数据 \(n<=10^{12}\) ;
对于 \(100\%\) 的数据 \(n<=10^{14}\) 。
样例
样例输入 |
---|
21 |
样例输出 |
---|
4 23 |
题解
首先暴力或者打表,都只能得20分
//打表程序
#include<bits/stdc++.h>
using namespace std;
inline char get(){
static char buf[30],*p1=buf,*p2=buf;
return p1==p2 && (p2=(p1=buf)+fread(buf,1,30,stdin),p1==p2)?EOF:*p1++;
}
inline long long read(){
register char c=get();register long long f=1,_=0;
while(c>'9' || c<'0')f=(c=='-')?-1:1,c=get();
while(c<='9' && c>='0')_=(_<<3)+(_<<1)+(c^48),c=get();
return _*f;
}
int main(){
freopen("watch.txt","w",stdout);
long long a,b;
long long n=0;
cout<<"a[]={0";
while(n<=10000005){
long long now=0;
n++;
for(register long long i=1;i<=n;i++){
for(register long long j=1;j<=n-i;j++){
//cout<<n<<":"<<i<<" "<<j<<endl;
if(i+j<=n && (i*j)%(i+j)==0){
//cout<<n<<":"<<i<<" "<<j<<endl;
now++;
}
}
}
cout<<","<<now;
}
cout<<"};";
return 0;
}
事实上,
这个时候让我们来看一下数据范围,对于100%的数据$ n\le10^{14} \(,为什么是\) 10 ^{14} $而不是\(10^{18}\)呢?说明这个题要用一个复杂度为$ O(\sqrt{n}) \(的算法(程序1s通常可以运算\) 10^{7} \(次),于是乎我们再次对式子进行变形,尽量向\)O(\sqrt{n})\(靠拢
先假设现在有满足条件的数\)a,b\(,同时我们设\)d=gcd(a,b)\(,则此时一定有:\)\(a^{'}=\frac{a}{k} , b^{'}=\frac{b}{k}\)$
对式子进行变形,则可以得到:
\]
\(∵k(a′+b′)\le n\)
$ ∴a'+b’ \le \sqrt{n}$
代码如下:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=10000005;
LL n,Ans;
int m,f[N],p[N],phi[N];
int main()
{
#ifndef ONLINE_JUDGE
freopen("uria.in","r",stdin);
freopen("uria.out","w",stdout);
#endif
cin>>n;
int lim=int(sqrt(n));
for(int i=2;i<=lim;i++)
{
if(!f[i])
p[++m]=i,phi[i]=i-1;
for(int j=1;j<=m&&i*p[j]<=lim;j++)
{
f[i*p[j]]=1;
if(i%p[j]==0)
{
phi[i*p[j]]=phi[i]*p[j];break;
}
phi[i*p[j]]=phi[i]*(p[j]-1);
}
Ans+=n/i/i*phi[i];
}
cout<<Ans;
return 0;
}
##B题 降雷神
#### 问题描述
降雷皇哈蒙很喜欢雷电,他想找到神奇的电光。
哈蒙有 \(n\) 条导线排成一排,每条导线有一个电阻值,神奇的电光
只能从一根导线传到电阻比它大的上面,而且必须从左边向右传导,
当然导线不必是连续的。
哈蒙想知道电光最多能通过多少条导线,还想知道这样的方案有
多少。
输入格式
第一行两个整数 \(n\) 和 \(t\) 。 \(t\) 表示数据类型
第二行 \(n\) 个整数表示电阻。
输出格式
第一行一个整数表示电光最多能通过多少条导线。
如果 \(t=1\) 则需要输出第二行,表示方案数,对 \(123456789\) 取模。
数据范围与约定
对于 \(20\%\) 的数据 \(n\leq 10\) ;
对于 \(40\%\) 的数据 \(n\leq 1000\) ;
对于另外 \(20\%\) 的数据 \(t=0\) ;
对于另外 \(20\%\) 的数据保证最多能通过不超过 \(100\) 条导线;
对于 \(100\%\) 的数据 \(n\leq 100000\) ,电阻值不超过 \(100000\) 。
样例
样例输入 |
---|
5 1 1 3 2 5 4 |
样例输出 |
---|
3 4 |
题解
对于\(t=0\)的时候,直接求出最长上升子序列即可(二十分做法)
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1000005;
int n, a[maxn], f[maxn], g[maxn], ans;
int t;
int main() {
cin >> n >> t;
for (int i = 1; i <= n; i++) cin >> a[i];
memset(g,0x3f,sizeof(g));
memset(f,0,sizeof(f));
g[0]=0;
ans=0;
for(int i=1;i<=n;i++){
f[i]=lower_bound(g+1,g+ans+1,a[i])-g;
g[f[i]]=a[i];
ans=max(ans,f[i]);
}
cout<<ans<<endl;
return 0;
}
事实上,我们需要做的只是在求最长上升子序列的同时再求出方案数即可。
#include<bits/stdc++.h>
using namespace std;
const int N=100005,M=5000005,Mod=123456789;
int lc[M],rc[M],s[M],rt[N],f[N],g[N],Max[N],Ans1,Ans2,tot,n,type;
void Add(int& x,int l,int r,int p,int k)
{
if(!x)
x=++tot,lc[x]=rc[x]=s[x]=0;
int Mid=l+r>>1;
s[x]=(s[x]+k)%Mod;
if(l==r)
return;
if(p<=Mid)
Add(lc[x],l,Mid,p,k);
else
Add(rc[x],Mid+1,r,p,k);
}
int Ask(int x,int l,int r,int p)
{
if(r<=p)
return s[x];
int Mid=l+r>>1;
if(p<=Mid)
return Ask(lc[x],l,Mid,p);
return (s[lc[x]]+Ask(rc[x],Mid+1,r,p))%Mod;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("hamon.in","r",stdin);
freopen("hamon.out","w",stdout);
#endif
cin>>n>>type;
for(int i=1;i<=n;i++)
{
int a;scanf("%d",&a);
for(int j=a-1;j;j-=j&-j)
f[i]=max(f[i],Max[j]);
if(f[i]==0)
g[i]=1;
else
g[i]=Ask(rt[f[i]],0,N,a-1);
f[i]++;
if(f[i]>Ans1)
Ans1=f[i],Ans2=0;
if(f[i]==Ans1)
Ans2=(Ans2+g[i])%Mod;
Add(rt[f[i]],0,N,a,g[i]);
for(int j=a;j<N;j+=j&-j)
Max[j]=max(Max[j],f[i]);
}
cout<<Ans1<<endl;
if(type)
cout<<Ans2<<endl;
return 0;
}//来自十里坡键神
NOIP2018 集训(二)的更多相关文章
- NOIp2018集训test-9-16(联考二day2)
T1旋转子段 一开始脑袋抽了花了近一个小时写了个跟这题毫无关系的莫名其妙的代码,一急代码就各种bug,最后t1就花了一个半小时多,然后后面时间不太够了,考得稀烂. 因为每个数存在唯一的中心使得绕这个中 ...
- NOIp2018集训test-9-15(联考二day1)
T1.矩阵游戏 水题.每一行最后乘的数为x[i],每一列为y[i],暴力算第一行的列的贡献,每一行的列的贡献是公差为所有列的贡献之和的等差数列,然后每一行再乘上行的贡献求和即为答案. //Achen ...
- NOIp2018集训test-10-17 (bike day3)
发现自己gradully get moodier and moodier了 负面情绪爆发地越来越频繁,根本out of control,莫名其妙地就像着了魔一样 为什么用英语大概是因为今天早上早自习因 ...
- [雅礼NOIP2018集训 day3]
考试的时候刚了T1两个小时线段树写了三个子任务结果发现看错了题目,于是接下来一个半小时我自闭了 result=历史新低 这告诉我们,打暴力要端正态度,尤其是在发现自己之前出锅的情况下要保持心态的平和, ...
- NOIp2018集训test-10-20 (bike day6)
B 君的第一题 lanzhou $x^{\frac{p-1}{2}}\equiv 1(mod\ p)$ $x\equiv x*x^{\frac{p-1}{2}} (mod\ p)$ $x\equiv ...
- NOIp2018集训test-9-19(am&pm)
AM 这是一套在长沙考过而且我能记得全部正解的题,然后期望得分300实际得分155. T1 很套路,随便搞(我当年是怎么花大半场时间写T1并且写出现在两倍长的代码的??) //Achen #inclu ...
- NOIp2018集训test-9-5(pm)
老张说:这套题太简单啦,你们最多两个小时就可以AK啦! 题 1 数数 我看到T1就懵了,这就是老张两个小时可以AK的题的T1?? 然后我成功地T1写了1h+,后面1h打了t2.t3暴力,就很开心. 等 ...
- NOIp2018集训test-9-1(pm)
欢乐%你赛,大家都AK了. 1. 小澳的方阵 吸取了前几天的教训,我一往复杂的什么二维树状数组上想就立刻打住阻止自己,就可以发现它是超级大水题了.记录每一行每一列最后一次的修改,对每个格子看它所在行和 ...
- NOIp2018集训test-10-24(am&pm)
李巨连续AK三场了,我跟南瓜打赌李巨连续AK七场,南瓜赌李巨连续AK五场. DAY1 T1 qu 按题意拿stack,queue和priority_que模拟即可.特判没有元素却要取出的情况. T2 ...
随机推荐
- POJ-3669 Meteor Shower---BFS+预处理
题目链接: https://vjudge.net/problem/POJ-3669 题目大意: 巨大流星雨即将袭来.每个流星会对击中的地方以及周围(上下左右四格)造成破坏.Bessie开始时位于(0, ...
- (转载)Fiddler模拟post四种请求数据
https://www.cnblogs.com/xiaoxi-3-/p/7612254.html https://blog.csdn.net/qq_15283475/article/details/5 ...
- [转] JAVA中读取网络中的图片资源导入到EXCEL中
需求 导出人员的信息并且加上人员的照片至EXCEL中 完整的代码 //创建一个表格 HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet sheet = wb ...
- putty乱码问题
1.将linux系统编码设置为utf-8 #vi /etc/sysconfig/i18n #设置为如下内容: LANG="en_US.UTF-8" SYSFONT="la ...
- 2、SpringBoot+Mybatis整合------一对一
开发工具:STS 代码下载链接:https://github.com/theIndoorTrain/SpringBoot_Mybatis01/tree/93398da60c647573645917b2 ...
- PureLayout,使用纯代码写AutoLayout
为iOS和OS X的自动布局最终的API -- 令人印象深刻的简单,非常强大. PureLayout延伸的UIView /NSView , NSArray,和NSLayoutConstraint与之后 ...
- django连接mysql数据库配置,出现no module named mysqldb报错
作为一个菜鸟运维也是要有梦想的,万一学会了python走向人生巅峰了呢.好吧,都是瞎想,今天主要介绍下django配置,最近也开始摸索这个牛b框架了,当然大佬肯定不屑一顾,都是照顾照顾我们这些菜鸟初学 ...
- struts2入门第一天----------配置环境
放假之后有空就开始走上了三大框架的学习.第一个选择的框架是struts2.首先第一步当然是环境的配置.去apache官网把struts2下载下来.然后在自己的开发工具下创建一个web项目.在lib文件 ...
- Docker自学纪实(三)Docker容器数据持久化
谈起数据卷 我一直觉得是个枯燥无聊的话题 但是通过今天的实操和阅读 我发现其实并不是 其实就像走夜路 没有光明,第一次都是恐惧 但是如果走的次数多了 或者静下心来去克制恐惧 也许就会驾轻就熟或者等到黎 ...
- Linux用户与组管理命令
1.列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可. who | cut -d" " -f1 | sort -u 或 who | cut -d ...