HGOI20180904(NOIP2018模拟sxn出题)

sol
输入n和H表示n个人,选H个人gcd最大
抓住排列,是x[1,n]的正整数,是连续的整数,
假设现在最大的公因数是k其中k一定是在[1,n]那么在排列中最多出现的个数为w
那么kw是最大的含有因数k的数字满足kw<=n所以k<=n/w
显然w越小答案k越大而w取值范围是[H,n]所以w=H时答案最大
所以 k(max)=n/H
由于选的序号最小那么for一遍按顺序输出即可
复杂度O(n)
# include <bits/stdc++.h>
using namespace std;
const int MAXN=;
int a[MAXN];
int main()
{
freopen("dst.in","r",stdin);
freopen("dst.out","w",stdout);
int n,k;
scanf("%d%d",&n,&k);
for (int i=;i<=n;i++) scanf("%d",&a[i]);
int temp=n/k; printf("%d\n",temp);
int cnt=;
for (int i=;i<=n;i++)
if (!(a[i]%temp)) {
printf("%d ",i),cnt++;
if (cnt==k) break;
}
return ;
}

sol
设F[i]为斐波那契数列的第i项,显然f[i]=f[i-2]+f[i-1]
一个有趣的结论 gcd(f[a],f[b])=f[gcd([a],[b])]
证明:
设n<m,设第f(n)与f(n+1)为a,b,则有:
首先 证明:gcd(F[n+1],F[n])=1;
辗转相减法:
gcd(F[n+1],F[n])
=gcd(F[n+1]-F[n],F[n])
=gcd(F[n],F[n-1])
=gcd(F[2],F[1])
=1
x f(x) 5
...
n a
n+1 b
n+ a+b
n+ a+2b
n+ 2a+3b
n+ 3a+5b
...
m f[m-n-1]a+f[m-n]b
因为gcd(m,n)=gcd(n,m%n)
所以 gcd(f(m),f(n))=gcd(f(n),f(m)%f(n))=gcd(a,f(m-n)b)
a,b相邻 gcd(a,b)=1;
f(n)=a【逃这应该看得出来吧】
gcd(f(m),f(n))=gcd(f(n),f(m-n))
辗转相减法 就是gcd(f(n),f(m%n))
辗转相除法 就是f(gcd(n,m))
对于20%的数据,0<n,m<100000 随便线性推一推就行
对于60%的随机数据 ,找到规律线性递推求斐波那契数列即可
对于100%的数据 n,m<=10^14,找到规律,用矩阵快速幂优化递推就行
单位矩阵这样的:
f[i-] f[i-] f[i] f[i-]
复杂度O(log n)
# include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mo=,MAXN=;
struct Node{
ll m[][];
};
Node tt;
ll gcd(ll a,ll b)
{
return b==?a:gcd(b,a%b);
}
Node mul(Node a,Node b)
{
Node t;
for (int i=;i<=;i++)
for (int j=;j<=;j++)
{
ll sum=;
for (int k=;k<=;k++)
sum=(sum+a.m[i][k]*b.m[k][j]%mo)%mo;
t.m[i][j]=sum%mo;
}
return t;
}
Node pow(Node x,ll n)
{
if (n==) return tt;
Node t=pow(x,n/);
t=mul(t,t);
if (n%==) t=mul(t,x);
return t;
}
int main()
{
freopen("st.in","r",stdin);
freopen("st.out","w",stdout);
/*
f[] a,b g=gcd(a,b);
f[g]=gcd[f[a],f[b]];
*/
ll n,m; scanf("%lld%lld",&n,&m);
if (n>m) swap(n,m);
ll g=gcd(n,m);
if (g==1ll||g==2ll) {
printf("1\n");
return ;
}
Node k;
k.m[][]=,k.m[][]=;
k.m[][]=;k.m[][]=;
tt=k;
Node w=pow(k,n-);
printf("%lld\n",w.m[][]%mo);
return ;
}

sol
错排问题的模板问题
假设A...为信封,a...为信件
我假设把a放B里,显然是一个错放,在这里我们可以看到这个错误出现的类型有两大类:(
就是导致这个错放的原因)
- b错放到A里,此时,b错放到A;a错放到B;后面的C..和A,B没有关系了,后面n-2个信封全错排 就是f(n-2)
- b错放到除了A、B之外的一个信封,剩下的n-1个信封全错排就能符合条件放法总数为f(n-1)
总而言之,在a错放到B里,共有错放法:f(n-2)+f(n-1)这么多种,
在a错放到C,错放到D……(n-1)种可能的情况下,同样有f(n-2)+f(n-1)种错放法,因此得出错放总数为
f(n)=(n-1){f(n-2)+f(n-1)}
复杂度O(n)
# include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mo=1e9+,MAXN=;
ll f[MAXN];
int main()
{
freopen("jdt.in","r",stdin);
freopen("jdt.out","w",stdout);
int n;
while(~scanf("%d",&n)) {
f[]=;f[]=;
for (int i=;i<=n;i++)
f[i]=(i-)*((f[i-]+f[i-])%mo)%mo;
printf("%lld\n",f[n]);
}
return ;
}
二项式反演
上个公式:

f(n)表示n个数的全排列,即 f(n)=n!
g(i)有n个信封中有i个信封错排,g(n)就是我们要求的结果。
f(n)= C(n,0)g(0) + C(n,1) g(1) ….+C(n,n) * g(n)
从n里面选0,1,2...n错排总数和就是全排列
因为对于全排列有2种可能:
1.正确摆放 (1)
2.有i个错误摆放 (0<i<=n)
归纳一下就是有i个错误摆放 (0=<i<=n)
反演一下就ok
g(n)=∑(-1)^(n-i) * C(n,i) * i! (从0到n)
C(n,i)的时候暴力搞一下逆元。
复杂度O(n)
std是这种方法:
#include <cstdio>
#include <algorithm>
#include <iostream>
#define LL long long
using namespace std;
int n;
const LL MOD=1e9+;
const int MAXN=;
LL f[MAXN],t[MAXN];
void fff(){
freopen("jdt.in","r",stdin);
freopen("jdt.out","w",stdout);
}
void fction(){
f[]=;
for (int i=;i<=;i++)f[i]=(f[i-]*i)%MOD;
t[]=t[]=;
for (int i=;i<=;i++)t[i]=((MOD-MOD/i)%MOD)*(t[MOD%i]%MOD)%MOD;
for (int i=;i<=;i++) t[i]=(t[i]*t[i-])%MOD;
}
int main(){
fff();
fction();
while (scanf("%d",&n)!=EOF){
LL ans=;
LL flag=n&?-:;
for (int i=;i<=n;i++){
ans=(ans+(flag*1ll*((f[n]%MOD)*t[n-i])%MOD))%MOD;
flag=-flag;
}
ans=(ans+MOD)%MOD;
printf("%lld\n",ans);
}
}
HGOI20180904(NOIP2018模拟sxn出题)的更多相关文章
- [NOIP2018模拟赛10.16]手残报告
[NOIP2018模拟赛10.16]手残报告 闲扯 炉石乱斗模式美滋滋啊,又颓到好晚... 上来T2先敲了树剖,看T1发现是个思博DP,然后没过大样例,写个暴力发现还是没过大样例!?才发现理解错题意了 ...
- NOIP2018 模拟赛(二十二)雅礼NOI
Preface 这次的题目都是NOI+的题,所以大家的分数都有点惨烈. 依靠T1大力骗分水到Rank2 所以想看正解的话看这里吧 A. 「雅礼NOI2018模拟赛(一) Day1」树 看一眼题目感觉十 ...
- EZ 2018 06 17 NOIP2018 模拟赛(十九)
这次的题目难得的水,但是由于许多哲学的原因,第二题题意表述很迷. 然后是真的猜题意了搞了. 不过这样都可以涨Rating我也是服了. Upt:链接莫名又消失了 A. 「NOIP2017模拟赛11.03 ...
- EZ 2018 06 10 NOIP2018 模拟赛(十八)
好久没写blog&&比赛题解了,最近补一下 这次还是很狗的,T3想了很久最后竟然连并查集都忘写了,然后T2map莫名爆炸. Rating爆减......链接不解释 好了我们开始看题. ...
- HGOI20180831 NOIP2018模拟
input1: 4 4 4 4 4 3 2 4 5 4 5 5 5 1 7 3 2 output1: Yes Yes Yes No 好的吧数学题QwQ考场上没人做出来qwq 就是判断两个矩形能否互相放 ...
- 【HHHOJ】NOIP2018 模拟赛(二十四) 解题报告
点此进入比赛 得分: \(100+60+100\)(挺好的,涨了一波\(Rating\)) 排名: \(Rank\ 1\) \(Rating\):\(+115\) \(T1\):[HHHOJ13]金( ...
- [jzoj NOIP2018模拟11.02]
嗯T1忘记取模了,100到20 嗯T2忘记了那啥定理,暴力也写炸了,这题我认 嗯T3线段树合并分裂没有写炸,考场上就知道妥妥的70分.但是,分数出的时候听到有人说暴力也是70分,我???脸黑,枉我敲了 ...
- [jzoj NOIP2018模拟10.29]
OI生涯的最高分,来了纪中这么多天,在经历了这么多场“NOIP难度”的模拟赛之后,终于看到了真正的NOIP 今天考场上效率很高,很快码完了全部的题目,留下了足够的时间对拍和...发呆.不得不说看着电脑 ...
- [JZOJ 5910] [NOIP2018模拟10.18] DuLiu 解题报告 (并查集+思维)
题目链接: https://jzoj.net/senior/#contest/show/2530/0 题目: LF是毒瘤出题人中AK IOI2019,不屑于参加NOI的唯一的人.他对人说话,总是满口垃 ...
随机推荐
- Bat 批处理杀死进程 重新启动程序
@echo offset pa=%cd%taskkill /F /IM wgscdTool.exeecho %pa%\wgscdTool.exeping /n 2 127.1>nulstart ...
- CCNode详解
cocos2d的所有类都以CC开头,那么实际上这个类的名字就是Node,类如其名,这个类的实例就是一个节点.Cocos2d的类是树状继承的,而在内存中,各个实例之间也是以“树”这种数据结构相关联的., ...
- [JOI2017春季合宿]Port Facility[set、二分图]
题意 你有两个栈,有 \(n\) 个货物,每个货物有一个进栈时间和出栈时间(所有时间的并集是1~2n),问有多少种不同的入栈方案. \(n\le 10^6\) 分析 把每个货物的存在看成区间,相交的区 ...
- R绘图 第八篇:绘制饼图(ggplot2)
geom_bar()函数不仅可以绘制条形图,还能绘制饼图,跟绘制条形图的区别是坐标系不同,绘制饼图使用的坐标系polar,并且设置theta="y": coord_polar(th ...
- R语言学习 第三篇:数据框
数据框(data.frame)是最常用的数据结构,用于存储二维表(即关系表)的数据,每一列存储的数据类型必须相同,不同数据列的数据类型可以相同,也可以不同,但是每列的行数(长度)必须相同.数据框的每列 ...
- C#用Infragistics 导入导出Excel(一)
最近项目中有数据的导入导出Excel的需求,这里做简单整理. 公司用的是Infragistics的产品,付费,不需要本地安装Office. 有需要的朋友可以下载 Infragistics.2013.2 ...
- .Net Core 分布式微服务框架介绍 - Jimu
系列文章 .Net Core 分布式微服务框架介绍 - Jimu .Net Core 分布式微服务框架 - Jimu 添加 Swagger 支持 一.前言 近些年一直浸淫在 .Net 平台做企业应用开 ...
- Harbor私有镜像仓库无坑搭建
转载:https://k8s.abcdocker.com/kubernetes_harbor.html 一.介绍 Docker容器应用的开发和运行路不开可靠的镜像管理,虽然Docker官方也提供了公共 ...
- Linux 上传代码到github
1.git init 初始化 2.git clone将刚刚创建的项目克隆下来 git clone https://github.com/... 3.进入到Project,编写代码 4.项目完成后执行g ...
- 认识 Iconfont 以及什么是 .eot、.woff、.ttf、.svg
一.Iconfont 1. 概述 在前端作业中,二十年前只有页面中铺满文字就算上线产品,现如今,不加点俏皮的“图标”会让页面显得很 Low 很 Low. 图标 在写这篇文章之前,我一直以为上图中的 ...