NOIP模拟26「神炎皇·降雷皇·幻魔皇」
T1:神炎皇
  又是数学题,气死,根本不会。
  首先考虑式子\(a+b=ab\),我们取\(a\)与\(b\)的\(gcd\):\(d\),那么式子就可以改写成:
\]
\]
  现在,有\(a'\)与\(b'\)互质,那么\(a'+b'\)一定不是\(a'b'\)的因子,这很显然,就不证了,那么\(a'+b'\)一定整除\(d\)。
\(\because\)\(a+b\)小于等于\(n\),且\(a'+b'\)小于或等于\(d\)(整除);
\(\therefore\)\(a'+b'\)小于或等于\(\sqrt{n}\);
  枚举\(a'+b'=k\),可以知道\(d\)有\(n/k^{2}\)个,证明:
\(\because\) \((a'+b')|d\)
\(\therefore\) \((a'+b')*d=(a'+b')^{2}*x<=n\)
  显然,\(d\)有\(x\)个。
  另外,考虑合法的\(a'+b'\)的对数,可以知道是\(\phi\)\((k)\)个,证明见土哥的博客。
  附上AC代码:
#include<bits/stdc++.h>
using namespace std;
namespace STD
{
	#define rr register
	#define   inf   LONG_LONG_MAX
	typedef long long ll;
	const ll N=100000000000000;
	const int SIZE=1e7+4;
	ll n,cnt;
	ll ans;
	ll prime[SIZE];
	ll phi[SIZE];
	bool isnotprime[SIZE];
	ll read()
	{
		rr ll x_read=0,y_read=1;
		rr char c_read=getchar();
		while(c_read<'0'||c_read>'9')
		{
			if(c_read=='-') y_read=-1;
			c_read=getchar();
		}
		while(c_read<='9'&&c_read>='0')
		{
			x_read=(x_read<<3)+(x_read<<1)+(c_read^48);
			c_read=getchar();
		}
		return x_read*y_read;
	}
	void pre()
	{
		for(rr ll i=2;i<=SIZE;i++)
		{
			if(!isnotprime[i]) prime[++cnt]=i,phi[i]=i-1;
			for(rr ll j=1;j<=cnt&&i*prime[j]<=SIZE;j++)
			{
				isnotprime[i*prime[j]]=1;
				if(i%prime[j]==0)
				{
					phi[i*prime[j]]=phi[i]*prime[j];
					break;
				}else phi[i*prime[j]]=phi[i]*(prime[j]-1);
			}
		}
	}
};
using namespace STD;
int main()
{
	pre();
	n=read();
	ll ceil=sqrt(n);
	for(rr ll i=1;i<=ceil;i++)
	{
		ll sum=phi[i];
		ll d=n/(i*i);
		ans+=sum*d;
	}
	cout<<ans;
}
T2:降雷皇
  太明显的一个数据结构优化DP了,求最长上升子序列即可,考场AC。
  直接上代码:
#include<bits/stdc++.h>
using namespace std;
namespace STD
{
	#define rr register
	#define inf INT_MAX
	typedef long long ll;
	const int N=100004;
	const int mod=123456789;
	const int R=100003;
	int n,type;
	int r[N];
	#define lc id<<1
	#define rc id<<1|1
	struct node
	{
		int maxn;
		ll cnt;
		node(){maxn=cnt=0;}
		node(int maxn_,ll cnt_){maxn=maxn_,cnt=cnt_;}
	};
	class Line_tree
	{
		private:
			node a[R<<2];
			void Insert(int,int,int,int,node);
			node Query(int,int,int,int,int);
		public:
			Line_tree(){}
			void insert(int pos,node val){Insert(1,1,R-1,pos,val);}
			node query(int st,int en)
			{
				if(st>en) return node(0,0);
				return Query(1,1,R-1,st,en);
			}
	}t;
	void Line_tree::Insert(int id,int l,int r,int pos,node val)
	{
		if(l==r)
		{
			if(a[id].maxn==val.maxn)
				a[id].cnt=(a[id].cnt+val.cnt)%mod;
			else if(a[id].maxn<val.maxn)
				a[id]=val;
			return;
		}
		int mid=(l+r)>>1;
		if(pos<=mid) Insert(lc,l,mid,pos,val);
		else Insert(rc,mid+1,r,pos,val);
		a[id]=(a[lc].maxn>a[rc].maxn)?a[lc]:a[rc];
		if(a[lc].maxn==a[rc].maxn)
			a[id].cnt=(a[lc].cnt+a[rc].cnt)%mod;
	}
	node Line_tree::Query(int id,int l,int r,int st,int en)
	{
		if(st<=l&&r<=en) return a[id];
		int mid=(l+r)>>1;
		node ret=node(-inf,0),temp;
		if(st<=mid)
		{
			temp=Query(lc,l,mid,st,en);
			if(temp.maxn>ret.maxn)
				ret=temp;
			else if(temp.maxn==ret.maxn)
				ret.cnt=(ret.cnt+temp.cnt)%mod;
		}
		if(mid<en)
		{
			temp=Query(rc,mid+1,r,st,en);
			if(temp.maxn>ret.maxn)
				ret=temp;
			else if(temp.maxn==ret.maxn)
				ret.cnt=(ret.cnt+temp.cnt)%mod;
		}
		return ret;
	}
	#undef lc
	#undef rc
	int read()
	{
		rr int x_read=0,y_read=1;
		rr char c_read=getchar();
		while(c_read<'0'||c_read>'9')
		{
			if(c_read=='-') y_read=-1;
			c_read=getchar();
		}
		while(c_read<='9'&&c_read>='0')
		{
			x_read=(x_read<<3)+(x_read<<1)+(c_read^48);
			c_read=getchar();
		}
		return x_read*y_read;
	}
};
using namespace STD;
int main()
{
	n=read(),type=read();
	for(rr int i=1;i<=n;i++)
		r[i]=read();
	int ans=-inf;
	ll num=0;
	for(rr int i=1;i<=n;i++)
	{
		node temp=t.query(1,r[i]-1);
		temp.maxn++;
		if(temp.cnt==0)
			temp.cnt=1;
		if(ans<temp.maxn)
		{
			num=temp.cnt;
			ans=temp.maxn;
		}
		else if(ans==temp.maxn)
			num=(num+temp.cnt)%mod;
		t.insert(r[i],temp);
	}
	cout<<ans;
	if(type==1)
		cout<<num;
}
T3:幻魔皇
  首先很明显,任意两个白点的\(LCA\)要么是白的,要么是黑的,分类讨论即可。
  首先观察一个性质,就是从第三层点开始,所有白点数目满足斐波那契数列,从第二层点开始,黑点满足斐波那契数列。
  且,由于树的拓扑性质,所有子树也满足这种性质。
  首先考虑\(LCA\)为白点的性质,那么就是\(LCA\)与儿子们匹配,直接用斐波那契数求即可。
  至于说黑点的情况,就是儿子们两两匹配即可。
  复杂度是\(O(n^{2}+n^{3})\)
  前缀和优化可以到\(O(n+n^{2})\)
  代码:
#include<bits/stdc++.h>
using namespace std;
namespace STD
{
	#define rr register
	#define inf INT_MAX
	typedef long long ll;
	const int N=5004;
	const int mod=123456789;
	int n;
	ll fib[N];
	ll sum[N];
	ll ans[N<<1];
	int read()
	{
		rr int x_read=0,y_read=1;
		rr char c_read=getchar();
		while(c_read<'0'||c_read>'9')
		{
			if(c_read=='-') y_read=-1;
			c_read=getchar();
		}
		while(c_read<='9'&&c_read>='0')
		{
			x_read=(x_read<<3)+(x_read<<1)+(c_read^48);
			c_read=getchar();
		}
		return x_read*y_read;
	}
	void pre()
	{
		fib[1]=1;
		sum[1]=1;
		for(rr int i=2;i<=5002;i++)
		{
			fib[i]=(fib[i-1]+fib[i-2])%mod;
			sum[i]=(sum[i-1]+fib[i])%mod;
		}
	}
};
using namespace STD;
int main()
{
	pre();
	n=read();
	for(rr int i=2;i<=n-1;i++)
		ans[i]=fib[n-i]*fib[i-1]%mod;
	for(rr int i=2;i<=n-2;i++)
		for(rr int j=3;j<=n-2;j++)
		{
			int x=max(i,j);
			ans[i+j]=(ans[i+j]+sum[n-x-1]*fib[i-1]%mod*fib[j-2]%mod)%mod;
		}
	for(rr int i=2;i<=n-2;i++)
		ans[i+1]=(ans[i+1]+sum[n-i-1]*fib[i-1]%mod)%mod;
	for(rr int i=1;i<=(n<<1);i++)
		printf("%lld ",ans[i]);
}
学到了什么:
  关于T1:
  首先,我忘了如何线性求phi函数了,正好复习了一下。
  考试的时候推了那个等式了,也除了\(GCD\)但是对phi函数这个东西不熟,结果啥也没搞出来,丢了个暴力就走了,还是对数论不熟,要复习了。。。。。。
  关于T2:
  考场AC还是很开心的,之前做过这种题,证明之前的知识都学到手了,还不错。
  关于T3:
  考场上看出性质了,原本搞了没有优化的正解(自我感觉是正解,实际上推了推,大体是对的),但是没时间码对,直接挂了,要是码力再强点,兴许有80分吧,谁知道呢,做这道时想起了之前做的一道有关斐波那契的题,以为巧妙编号就可以靠编号搞出\(LCA\)因此想歪了。。。。。。
NOIP模拟26「神炎皇·降雷皇·幻魔皇」的更多相关文章
- NOIP 模拟 $26\; \rm 神炎皇$
		
题解 \(by\;zj\varphi\) 一道 \(\varphi()\) 的题. 对于一个合法的数对,设它为 \((a*m,b*m)\) 则 \(((a+b)*m)|a*b*m^2\),所以 \(( ...
 - noip模拟26[肾炎黄·酱累黄·换莫黄]
		
\(noip模拟26\;solutions\) 这个题我做的确实是得心应手,为啥呢,因为前两次考试太难了 T1非常的简单,只不过我忘记了一个定理, T2就是一个小小的线段树,虽然吧我曾经说过我再也不写 ...
 - 「10.10」神炎皇(欧拉函数)·降雷皇(线段树,DP)·幻魔皇
		
A. 神炎皇 很好的一道题,可能第一次在考场上遇到欧拉函数 题意:对于一个整数对 $(a,b)$,若满足 $a\times b\leq n$且$a+b$是$a\times b$的因子, 则称为神奇的数 ...
 - [考试总结]noip模拟26
		
首先看到这样中二的题目心头一震.... 然而发现又是没有部分分数的一天. 然而正解不会打.... 那还是得要打暴力. 但是这套题目有两个题目只有一个参数. 所以... (滑稽).jpg 然后我就成功用 ...
 - 2021.7.28考试总结[NOIP模拟26]
		
罕见的又改完了. T1 神炎皇 吸取昨天三个出规律的教训,开场打完T2 20pts直接大力打表1h. 但怎么说呢,我不懂欧拉函数.(其实exgcd都忘了 于是只看出最大平方因子,不得不线性筛,爆拿60 ...
 - NOIP 模拟 $26\; \rm 降雷皇$
		
题解 \(by\;zj\varphi\) 用树状数组优化一下求最长上升子序列即可. 至于第二问,在求出答案后开 \(n\) 棵线段树,每颗维护当前最长上升子序列长度的方案数. Code #includ ...
 - NOIP 模拟 $26\; \rm 幻魔皇$
		
题解 \(by\;zj\varphi\) 观察可发现一个点向它的子树走能到的白点,黑点数是一个斐波那契数列. 对于白色点对,可以分成两种情况: 两个白点的 \(lca\) 是其中一个白点 两个白点的 ...
 - noip模拟赛 伪神
		
题目背景 一切就绪 但愿,这样就好 自那之后的五年—— 作为封印持续增大的结果,在我体内积蓄了庞大的光精灵的力量 在幻灯结界里觉醒过来的我,和从封印解放出的德米奥格,就如同字面意思所述的,获得了等同于 ...
 - NOIP模拟26
		
把题解沽了好久了,今天还是不想写,我们靠的B卷其实挺水的,但是我就是想吐槽一下!咋还带题目里面放题解的?题里一点题解的线索都没有,但是玄机竟然在题目里! 我也是醉了,T1就是一个贪心,题目说贪婪,T2 ...
 
随机推荐
- Redis(6379)未授权访问
			
环境搭建 打开kali终端 输入命令 wget http://download.redis.io/releases/redis-3.2.0.tar.gz tar xzf redis-3.2.0.tar ...
 - Java数组06——冒泡排序
			
冒泡排序 例子: package array;  import java.util.Arrays;  public class ArrayDemon08 { public static ...
 - C++ 继承方式  //语法:class 子类 :继承方式  父类 //继承方式 三种: //1.公共继承 //2.保护继承 //3.私有继承
			
1 //继承方式 2 //语法:class 子类 :继承方式 父类 3 //继承方式 三种: 4 //1.公共继承 5 //2.保护继承 6 //3.私有继承 7 8 #include <ios ...
 - Java 14 新功能介绍
			
不做标题党,认认真真写个文章. 文章已经收录在 Github.com/niumoo/JavaNotes 和未读代码博客,点关注,不迷路. Java 14 早在 2019 年 9 月就已经发布,虽然不是 ...
 - TCP 才不傻!
			
大家好,我是小林. 之前收到个读者的问题,对于 TCP 三次握手和四次挥手的一些疑问: 第一次握手,如果客户端发送的SYN一直都传不到被服务器,那么客户端是一直重发SYN到永久吗?客户端停止重发SYN ...
 - [开源]入坑Qt,我的第一个小程序:MD5计算器
			
版权声明 --------- 本文仅在知乎与博客园发布.开发者为szx0427 MFC和Win32搞了好几年了,也算是懂了个皮毛,但是一直觉得用这两者开发软件都很麻烦,需要将大量的代码花费在UI等地方 ...
 - 面试官:MySQL 有哪些锁??
			
大家好,我是小林. 这次,来说说 MySQL 的锁,主要是 Q&A 的形式,看起来会比较轻松. 不多 BB 了,发车! 在 MySQL 里,根据加锁的范围,可以分为全局锁.表级锁和行锁三类. ...
 - MySQL-09-SQL执行计划
			
SQL执行计划获取及分析 介绍 (1)获取到的是优化器选择完成的,他认为代价最小的执行计划. 作用: 语句执行前,先看执行计划信息,可以有效的防止性能较差的语句带来的性能问题. 如果业务中出现了慢语句 ...
 - IDEA spring boot项目插件打包方式jar
			
一.打包 1.pom.xml中添加插件依赖 <build> <plugins> <plugin> <!--打包成可执行jar--> <groupI ...
 - flutter中存储键值对简单数据(相当于前端localstorage概念)
			
首先需要安装一个官方推荐包: 1 dependencies: 2 flutter: 3 sdk: flutter 4 shared_preferences: any // 先获取 shared pre ...