11.5NOIP2018提高组模拟题
书信(letter)
Description
有 n 个小朋友, 编号为 1 到 n, 他们每人写了一封信, 放到了一个信箱里, 接下来每个人从中抽取一封书信。 显然, 这样一共有 n!种拿到书信的情况。
现在亮亮规定, 对任意的 1<=x,y<=n, 如果 x 号小朋友拿到 u 号小朋友写的 书信, y 号小朋友拿到 v 号小朋友写的书信, 那么(x+y)号小朋友必须拿到(u+v) 号小朋友写的书信(这里的加法若和超过了 n, 那么就减去 n) 。
小林想知道, 总共有多少种拿到书信的情况呢?
Input
只有一行一个正整数 n。
Output
只有一行一个正整数, 表示符合条件的情况的总数。
这题感觉不太可证明,自己不会
通过枚举全排列打表发现,这题就是一个裸的求\(\phi(n)\)
\(O(\sqrt{n})\)求\(\phi(n)\)的话就不多\(BB\)了 。
这里放一下公式。
\]
然后直接去求然后输出即可。
代码
#include<cstdio>
#include<iostream>
#include<algorithm>
#define int long long
#define R register
using namespace std;
inline void in(R int &x)
{
	int f=1;x=0;char s=getchar();
	while(!isdigit(s)){if(s=='-')f=-1;s=getchar();}
	while(isdigit(s)){x=x*10+s-'0';s=getchar();}
	x*=f;
}
int n;
inline int phi(int x)
{
    int res=x;
    for(int i=2;i*i<=x;i++)
    {
        if(x%i==0)
        {
            res=res/i*(i-1);
            while(x%i==0)x/=i;
        }
    }
    if(x>1)res=res/x*(x-1);
    return res;
}
signed main()
{
	freopen("letter.in","r",stdin);
	freopen("letter.out","w",stdout);
	in(n);
	printf("%lld\n",phi(n));
	fclose(stdin);
	fclose(stdout);
	return 0;
}
金条(au)
Description
小林在一家商店里购物, 共有 i 件物品, 第 i 件物品的价格为 i。 小林身上带 了许多金条, 每根金条的价值都为整数, 价值为 1~N 的金条数量都足够多。
对于任何一件物品,小林只会用同一价值的若干金条购买它,而且不能找零。 因此, 对于第 i 件物品, 会有 C(i)种购买方法。 小林只会选择这样的一件物品 i 进行购买: C(i) > max{ C(j) }, 1 <= j < i。
请你告诉小林, 他能购买的最贵的物品的价格是多少。
Input
只有一行一个整数 N。
Output
只有一个整数, 表示答案。
通过读题可以发现,我们是求\(1\)到\(n\)之间的约数个数最多的数。
PS:如果两个数的约数个数相同,取较小的一个。
有一个结论:可以求一个数的约数个数。
首先根据唯一分解定理(其中\(p_1\)是素数)
\]
那么一个数的约数个数就是这个:
\]
\(d(x)\)表示\(x\)的约数个数。
然后通过计算可以知道,在\(2 \times 10^9\)中不同的质数的个数不会超过\(10\)个.
因此我们写出前\(10\)个素数.
然后直接暴力搜索即可。
注意:两个数的约数个数相同的话,取较小的一个。
题目要求严格\(>\)
代码
#include<cstdio>
#include<iostream>
#include<algorithm>
#define int long long
#define R register
using namespace std;
inline void in(int &x)
{
	int f=1;x=0;char s=getchar();
	while(!isdigit(s)){if(s=='-')f=-1;s=getchar();}
	while(isdigit(s)){x=x*10+s-'0';s=getchar();}
	x*=f;
}
int prime[20]={0,2,3,5,7,11,13,17,19,23,29,31,37,41};
int ans,mx,n;
void dfs(R int dep,R int now,R int cnt)
{
	if(dep>=11)return;
	if(cnt>mx)mx=cnt,ans=now;
	if(cnt==mx and ans>now)ans=now;
	for(R int i=1;i<=32;i++)
	{
		if(now*prime[dep]>n)break;
		dfs(dep+1,now*=prime[dep],cnt*(i+1));
	}
}
signed main()
{
	freopen("au.in","r",stdin);
	freopen("au.out","w",stdout);
	in(n);
	dfs(1,1,1);
	printf("%lld",ans);
	fclose(stdin);
	fclose(stdout);
	return 0;
}
小朋友(friend)
Description
n 个小朋友在一起做游戏, 第 i 个小朋友的快乐值为 Di。 当第 i 个小朋友和 第 j 个小朋友一起玩时, 他们能获得 Di xor Dj 的快乐值。 每一个小朋友 i 都 想知道, 他和谁一起玩能够获得最大的快乐值, 请你帮他们每个人分别求出这个 值。
Input
第一行有一个整数 \(n\)。 第二行三个整数 \(K, B, P\)(\(1≤K≤20\), \(0≤B<2^{16}\), \(0≤P<2^{24}\)) 。 根据 $ D_i = (K \times D_{i-1} + B)%2^{24}$ 和 \(D_1 = P\) 自行计算整个 \(P\) 数组 。
Output
一个整数 \(Ans\),\(Ans=(\sum_{i=1}^{n} 3^{i-1} \times Ans_i)%2^{24}\) 。 其中 \(Ans_i\) 表示对于第 i 个小朋友 我们需要的答案。
表示看到异或,还是取两两异或的最大值,选择树\(01Trie\)。
这个东西网上讲解很多,不多\(BB\).
我们将得到的\(D_i\)插入到\(Trie\)树中。
查询就普通查询(贪心)即可。
时限由于有\(5s\)所以怎么搞都行。
注意不要傻到每次\(ksm\)求\(3^{i-1}\)
可以预处理,可以用一个变量。(这里我用了预处理)
这可以说是一个裸题?
代码
#include<cstdio>
#include<iostream>
#include<algorithm>
#define mod 16777216
#define lo long long
#define R register
using namespace std;
const int gz=2e6+5;
inline void in(R lo &x)
{
	int f=1;x=0;char s=getchar();
	while(!isdigit(s)){if(s=='-')f=-1;s=getchar();}
	while(isdigit(s)){x=x*10+s-'0';s=getchar();}
	x*=f;
}
lo n,K,B,P,ans;
lo a[gz],po[gz]={1};
struct Trie
{
	int ch[gz*15][2],idx;
	inline void ins(R int x)
	{
		R int u=0;
		for(R int i=25;i>=0;i--)
		{
			R int bit=(x>>i)&1LL;
			if(!ch[u][bit])ch[u][bit]=++idx;
			u=ch[u][bit];
		}
	}
	inline int query(R int x)
	{
		R int u=0,res=0;
		for(R int i=25;i>=0;i--)
		{
			R int bit=(x>>i)&1LL;
			if(ch[u][bit^1])
			{
				res+=(1LL<<i);
				u=ch[u][bit^1];
			}
			else u=ch[u][bit];
		}
		return res;
	}
}woc;
int main()
{
	freopen("friend.in","r",stdin);
	freopen("friend.out","w",stdout);
	in(n);in(K),in(B),in(P);a[1]=P%mod;woc.ins(a[1]);
	for(R int i=1;i<=n;i++)po[i]=po[i-1]*3%mod;
	for(R int i=2;i<=n;i++)
	{
		a[i]=((K*a[i-1])%mod+B)%mod;
		woc.ins(a[i]%mod);
	}
	for(R int i=1;i<=n;i++)
		(ans+=po[i-1]*woc.query(a[i])%mod)%=mod;
	printf("%lld\n",(ans+mod)%mod);
}
												
											11.5NOIP2018提高组模拟题的更多相关文章
- 【2020.11.28提高组模拟】T1染色(color)
		
[2020.11.28提高组模拟]T1染色(color) 题目 题目描述 给定 \(n\),你现在需要给整数 \(1\) 到 \(n\) 进行染色,使得对于所有的 \(1\leq i<j\leq ...
 - NOIP2018提高组模拟题(五)
		
字符串(string) Description 小林与亮亮正在做一个游戏.小林随意地写出一个字符串,字符串只由大写 字母组成,然后指定一个非负整数 m,亮亮可以进行至多 m 次操作,每次操作 为交换相 ...
 - 2019.6.21 NOIP2018提高组模拟题(二)
		
1.咒语 (curse.pas/c/cpp) [题目描述] 亮亮梦到自己来到了魔法城堡,但一扇巨大的石门阻拦了他通向城堡内的路.正当他沮丧之际,突然发现门上有一处机关,机关上有一张很长的纸条.亮亮拿起 ...
 - 【2020.11.28提高组模拟】T2 序列(array)
		
序列(array) 题目描述 给定一个长为 \(m\) 的序列 \(a\). 有一个长为 \(m\) 的序列 \(b\),需满足 \(0\leq b_i \leq n\),\(\sum_{i=1}^ ...
 - NOIP2018提高组模拟题(四)
		
能量(energy) Description  有一块能量田,它的形状是 n*m的矩形,每一个格子上都有一个能量值 a[x][y] (可正可负).一块矩形田的能量定义为它的每个格子的能量值之和.  ...
 - NOIP2018提高组模拟题(六)
		
购物(shop) Description 小林来到商店中进行购物.商店里一共有 n 件物品,第 i 件物品的价格为 a[i] 元.小林总共需要购买 m 件物品,他希望他所花费的钱最少,请你计算出最小 ...
 - 10.18 NOIP2018提高组模拟题(二)
		
大水题 1.咒语 (curse.pas/c/cpp) [题目描述] 亮亮梦到自己来到了魔法城堡,但一扇巨大的石门阻拦了他通向城堡内的路.正当他沮丧之际,突然发现门上有一处机关,机关上有一张很长的纸条. ...
 - NOIP2018提高组模拟题(二)
		
咒语(curse) Description 亮亮梦到自己来到了魔法城堡,但一扇巨大的石门阻拦了他通向城堡内的路. 正当他沮丧之际,突然发现门上有一处机关,机关上有一张很长的纸条. 亮亮拿起纸条的一端, ...
 - XJOI——NOIP2015提高组模拟题19-day1——观光旅行
		
http://www.hzxjhs.com:83/contest/493/problem/3 [题目大意] 给定一个有n(n<=500000)个点,m(1<=500000)条边的无向图.给 ...
 
随机推荐
- 无人值守安装linux系统
			
需要使用到的服务:PXE + DHCP+TFTP+ Kickstart+ FTP KickStart是一种无人职守安装方式 执行 PXE + KickStart安装需要准备内容: • DHCP 服务 ...
 - activity栈清空
			
http://blog.csdn.net/swjtuxu/article/details/26163737
 - 解决es6中webstrom不支持import的一个简单方法
			
代码如下: export_one.js的代码如下: export function one() { console.log('one'); } export function two() { cons ...
 - hibernate连接mysql,自动建表失败
			
hibernate的列名使用了mysql的关键字.
 - Maven环境搭建、调试、打包
			
1.配置Maven环境 将下载文件解压,然后设置maven环境 新建环境变量M2_HOME 变量名:M2_HOME 变量值:F:\maven\apache-maven-3.0.3 追加path环境变量 ...
 - c# vs2008报表
			
1. 做报表没做几次,第一次做的都忘记了,还好今天做一下就把报表弄成功了.报表中“参数字段”是可以变的,就是说需要自己赋值或者是要计算的.而在苏据库字段里面的是固定的值.不需要计算(注:有的字段查询出 ...
 - 动态规划:LCS
			
先上状态转移方程,还是很容易看明白的 例题是Codevs的1862,这个题不是实现了方程就可以了的,还要完成一个事情那就是计数,数一数到底有多少个最长公共子序列 #include<cstdio& ...
 - IDEA新建时选项没有java class问题
			
解决办法: 点击你的project F4打开project stucture 点击左边的module 点击右边的source后添加src就可以了 添加的src就是源码可以放置的地址
 - HDU    1840    Equations  (数学)
			
title: Equations 数学 杭电1840 tags: [数学] 题目链接 Problem Description All the problems in this contest tota ...
 - linux USB HOST之EHCI和OHCI【转】
			
转自:http://blog.csdn.net/ljzcom/article/details/8186914 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 2 关键数据结 ...