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的唯一的人.他对人说话,总是满口垃 ...
随机推荐
- python with原理
在python2.5+中可以用with来保证关闭打开的文件 with open('hello.txt') as f: do some file operations 为什么要引入with呢? 在之前如 ...
- C++自学成长之路(第一篇)
今天开始我将开启C++自学成长之路,今天是第一天,在以前就一直在网上查找关于c++的资料,想买一本好一点的,权威一点的资料书,通过努力查找,我选择了c++ primer,在网上这本书的好评如潮.更多的 ...
- Centos 定时任务发送smtp邮件
接着上一篇文章...... 1.首先创建一个sheel的脚本命令,我是在home文件夹下面创建的命令: touch a.sh 2.编辑a.sh脚本 vim a.sh ,键入键盘 i 键 准备插入 ...
- 取两张mysql表中分别两个字段相同的值
看起来有点绕口吧,举个例子吧,如图 两张表,字段名也不同字段gs 和另一张表 gsmc 的有些值是相同的 我们要做的就是把这个相同的值找出来 会写这个sql语句就可以 只写重点 $sql2 = &q ...
- 【转载】SSD断电保护原理
异常掉电的隐患 若没有合理的掉电保护机制,而异常掉电的发生又不可避免,当发生异常掉电,会引发很多问题. (1)丢盘 异常掉电,会使得映射表来不及保存,丢失逻辑地址到物理地址的映射,待重新上电后,SSD ...
- python图像处理 模式转化简单总结
图像处理库PIL有九种不同模式:1,L,P,RGB,RGBA,CMYK,YCbCr,I,F 1.模式“1” 模式“1”为二值图像,非黑即白.但是它每个像素用8个bit表示,0表示黑,255表示白. 2 ...
- 【转】Cocos2d-x 3.x基础学习: 总结数学类Vec2/Size/Rect
转载:http://www.taikr.com/article/1847 在Cocos2d-x 3.x中,数学类Vec2.Size.Rect,是比较常用的类.比如设置图片位置,图片大小,两图片的碰撞检 ...
- 新手向:从不同的角度来详细分析Redis
最近对华为云分布式缓存产品Redis做了一些研究,于是整理了一些基本的知识拿出来与大家分享,首先跟大家分享的是,如何从不同的角度来详细使用Redis. 小编将从以下9个角度来进行详细分析,希望可以帮到 ...
- kubeadm安装K8S单master双节点集群
宿主机:master:172.16.40.97node1:172.16.40.98node2:172.16.40.99 # 一.k8s初始化环境:(三台宿主机) 关闭防火墙和selinux syste ...
- 20181023-3 每周例行报告(添加PSP)
此作业要求:[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2100] 一.本周PSP表格 类型 任务 开始时间 结束时间 中断时间 净时 ...