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分

  1. //打表程序
  2. #include<bits/stdc++.h>
  3. using namespace std;
  4. inline char get(){
  5. static char buf[30],*p1=buf,*p2=buf;
  6. return p1==p2 && (p2=(p1=buf)+fread(buf,1,30,stdin),p1==p2)?EOF:*p1++;
  7. }
  8. inline long long read(){
  9. register char c=get();register long long f=1,_=0;
  10. while(c>'9' || c<'0')f=(c=='-')?-1:1,c=get();
  11. while(c<='9' && c>='0')_=(_<<3)+(_<<1)+(c^48),c=get();
  12. return _*f;
  13. }
  14. int main(){
  15. freopen("watch.txt","w",stdout);
  16. long long a,b;
  17. long long n=0;
  18. cout<<"a[]={0";
  19. while(n<=10000005){
  20. long long now=0;
  21. n++;
  22. for(register long long i=1;i<=n;i++){
  23. for(register long long j=1;j<=n-i;j++){
  24. //cout<<n<<":"<<i<<" "<<j<<endl;
  25. if(i+j<=n && (i*j)%(i+j)==0){
  26. //cout<<n<<":"<<i<<" "<<j<<endl;
  27. now++;
  28. }
  29. }
  30. }
  31. cout<<","<<now;
  32. }
  33. cout<<"};";
  34. return 0;
  35. }

事实上,

这个时候让我们来看一下数据范围,对于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′)\%k^2a′b′=0
\]

\(∵k(a′+b′)\le n\)

$ ∴a'+b’ \le \sqrt{n}$

代码如下:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long LL;
  4. const int N=10000005;
  5. LL n,Ans;
  6. int m,f[N],p[N],phi[N];
  7. int main()
  8. {
  9. #ifndef ONLINE_JUDGE
  10. freopen("uria.in","r",stdin);
  11. freopen("uria.out","w",stdout);
  12. #endif
  13. cin>>n;
  14. int lim=int(sqrt(n));
  15. for(int i=2;i<=lim;i++)
  16. {
  17. if(!f[i])
  18. p[++m]=i,phi[i]=i-1;
  19. for(int j=1;j<=m&&i*p[j]<=lim;j++)
  20. {
  21. f[i*p[j]]=1;
  22. if(i%p[j]==0)
  23. {
  24. phi[i*p[j]]=phi[i]*p[j];break;
  25. }
  26. phi[i*p[j]]=phi[i]*(p[j]-1);
  27. }
  28. Ans+=n/i/i*phi[i];
  29. }
  30. cout<<Ans;
  31. return 0;
  32. }

##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\)的时候,直接求出最长上升子序列即可(二十分做法)

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int maxn = 1000005;
  4. int n, a[maxn], f[maxn], g[maxn], ans;
  5. int t;
  6. int main() {
  7. cin >> n >> t;
  8. for (int i = 1; i <= n; i++) cin >> a[i];
  9. memset(g,0x3f,sizeof(g));
  10. memset(f,0,sizeof(f));
  11. g[0]=0;
  12. ans=0;
  13. for(int i=1;i<=n;i++){
  14. f[i]=lower_bound(g+1,g+ans+1,a[i])-g;
  15. g[f[i]]=a[i];
  16. ans=max(ans,f[i]);
  17. }
  18. cout<<ans<<endl;
  19. return 0;
  20. }

事实上,我们需要做的只是在求最长上升子序列的同时再求出方案数即可。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N=100005,M=5000005,Mod=123456789;
  4. int lc[M],rc[M],s[M],rt[N],f[N],g[N],Max[N],Ans1,Ans2,tot,n,type;
  5. void Add(int& x,int l,int r,int p,int k)
  6. {
  7. if(!x)
  8. x=++tot,lc[x]=rc[x]=s[x]=0;
  9. int Mid=l+r>>1;
  10. s[x]=(s[x]+k)%Mod;
  11. if(l==r)
  12. return;
  13. if(p<=Mid)
  14. Add(lc[x],l,Mid,p,k);
  15. else
  16. Add(rc[x],Mid+1,r,p,k);
  17. }
  18. int Ask(int x,int l,int r,int p)
  19. {
  20. if(r<=p)
  21. return s[x];
  22. int Mid=l+r>>1;
  23. if(p<=Mid)
  24. return Ask(lc[x],l,Mid,p);
  25. return (s[lc[x]]+Ask(rc[x],Mid+1,r,p))%Mod;
  26. }
  27. int main()
  28. {
  29. #ifndef ONLINE_JUDGE
  30. freopen("hamon.in","r",stdin);
  31. freopen("hamon.out","w",stdout);
  32. #endif
  33. cin>>n>>type;
  34. for(int i=1;i<=n;i++)
  35. {
  36. int a;scanf("%d",&a);
  37. for(int j=a-1;j;j-=j&-j)
  38. f[i]=max(f[i],Max[j]);
  39. if(f[i]==0)
  40. g[i]=1;
  41. else
  42. g[i]=Ask(rt[f[i]],0,N,a-1);
  43. f[i]++;
  44. if(f[i]>Ans1)
  45. Ans1=f[i],Ans2=0;
  46. if(f[i]==Ans1)
  47. Ans2=(Ans2+g[i])%Mod;
  48. Add(rt[f[i]],0,N,a,g[i]);
  49. for(int j=a;j<N;j+=j&-j)
  50. Max[j]=max(Max[j],f[i]);
  51. }
  52. cout<<Ans1<<endl;
  53. if(type)
  54. cout<<Ans2<<endl;
  55. return 0;
  56. }//来自十里坡键神

NOIP2018 集训(二)的更多相关文章

  1. NOIp2018集训test-9-16(联考二day2)

    T1旋转子段 一开始脑袋抽了花了近一个小时写了个跟这题毫无关系的莫名其妙的代码,一急代码就各种bug,最后t1就花了一个半小时多,然后后面时间不太够了,考得稀烂. 因为每个数存在唯一的中心使得绕这个中 ...

  2. NOIp2018集训test-9-15(联考二day1)

    T1.矩阵游戏 水题.每一行最后乘的数为x[i],每一列为y[i],暴力算第一行的列的贡献,每一行的列的贡献是公差为所有列的贡献之和的等差数列,然后每一行再乘上行的贡献求和即为答案. //Achen ...

  3. NOIp2018集训test-10-17 (bike day3)

    发现自己gradully get moodier and moodier了 负面情绪爆发地越来越频繁,根本out of control,莫名其妙地就像着了魔一样 为什么用英语大概是因为今天早上早自习因 ...

  4. [雅礼NOIP2018集训 day3]

    考试的时候刚了T1两个小时线段树写了三个子任务结果发现看错了题目,于是接下来一个半小时我自闭了 result=历史新低 这告诉我们,打暴力要端正态度,尤其是在发现自己之前出锅的情况下要保持心态的平和, ...

  5. 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 ...

  6. NOIp2018集训test-9-19(am&pm)

    AM 这是一套在长沙考过而且我能记得全部正解的题,然后期望得分300实际得分155. T1 很套路,随便搞(我当年是怎么花大半场时间写T1并且写出现在两倍长的代码的??) //Achen #inclu ...

  7. NOIp2018集训test-9-5(pm)

    老张说:这套题太简单啦,你们最多两个小时就可以AK啦! 题 1 数数 我看到T1就懵了,这就是老张两个小时可以AK的题的T1?? 然后我成功地T1写了1h+,后面1h打了t2.t3暴力,就很开心. 等 ...

  8. NOIp2018集训test-9-1(pm)

    欢乐%你赛,大家都AK了. 1. 小澳的方阵 吸取了前几天的教训,我一往复杂的什么二维树状数组上想就立刻打住阻止自己,就可以发现它是超级大水题了.记录每一行每一列最后一次的修改,对每个格子看它所在行和 ...

  9. NOIp2018集训test-10-24(am&pm)

    李巨连续AK三场了,我跟南瓜打赌李巨连续AK七场,南瓜赌李巨连续AK五场. DAY1 T1 qu 按题意拿stack,queue和priority_que模拟即可.特判没有元素却要取出的情况. T2 ...

随机推荐

  1. [转载]——Axure+SVN配置

    最近进行考试系统重构,一个小组十几个人,这么多人要同时搞需求画原型.这样原本的合作开发工具SVN已经不能满足现在的需求了,这是就找到了一个新的方法——Axure+SVN. 在SVN服务器端建立一个空的 ...

  2. 转载:手把手教你搭建 vue 环境

    以下内容转自: https://segmentfault.com/a/1190000008922234 第一步 node环境安装 1.1 如果本机没有安装node运行环境,请下载node 安装包进行安 ...

  3. 启动Windows服务

    实现效果: 知识运用: ServiceController类的ServiceName Status属性 public string ServiceName {get; set;} //对此Servic ...

  4. Git基础篇

    对于Git的一些基础了解,安装,里面的一些名词,这里就不做介绍了.主要记录怎么使用GIt. 本篇介绍: 配置个人信息        生成本地仓库并与远程库相连        添加SSH秘钥       ...

  5. JAVA_Converter_字符串类型转Date类型

    我们知道数据库中的时间一般为Date类型,而前台传递过来的为字符串,BeanUtils在封装数据的时候,没有将类型转换,导致报异常... 我们只需要在封装数据之前,使用自定义转换器即可: 代码如下: ...

  6. 获取Grid后台动态添加的子项

    例:Grid的子项是包含边框的复选框CheckBox //遍历Grid中的子项 foreach (var c in this.grid_box.Children) { Border bd = c as ...

  7. 对于未来学习Linux的决心书,以此为鉴

    学习Linux的决心书 我叫曹佳佳,来自祖国的大西北甘肃庆阳,2016年大专毕业之后从事自己的专业风力发电行业工作了两年多在从事风电行业的过程中越来越感觉到自己的薪资待遇和以后的发展空间越来越小,而且 ...

  8. [Wolfgang Mauerer] 深入linux 内核架构 第一章 概述

    作为Linux开发爱好者,从事linux 开发有两年多时间.做过bsp移植,熟悉u-boot代码执行流程:看过几遍<linux 设备驱动程序开发>,分析过kernel启动流程,写过驱动,分 ...

  9. 面试题 LazyMan 的Rxjs实现方式

    前言 笔者昨天在做某公司的线上笔试题的时候遇到了最后一道关于如何实现LazyMan的试题,题目如下 实现一个LazyMan,可以按照以下方式调用:LazyMan("Hank")输出 ...

  10. JZOJ 5906. 传送门

    Description             8102年,Normalgod在GLaDOS的帮助下,研制出了传送枪.但GLaDOS想把传送枪据为己有,于是把Normalgod扔进了一间实验室.这间实 ...