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的唯一的人.他对人说话,总是满口垃 ...
随机推荐
- Maven私有仓库-使用docker部署Nexus
查看官方镜像说明 nexus2 nexus3 建议使用nexus2,可能网上的资料这个版本居多. 我选择的是nexus3,~~~ 启动容器 官方说明中提到的是使用docker直接启动.我选择用dock ...
- Windows10安装vmware和centos7
1. 下载vmware安装包 地址(vmware版本:vmware workstation 14):http://xzc.197746.com/vmware-workstation-full1413. ...
- 20155302《网络对抗》Exp6 信息收集与漏洞扫描
20155302<网络对抗>Exp6 信息收集与漏洞扫描 实验内容 (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描技术:主机发现.端口扫描.OS及服务版本探测 ...
- SpingMVC的<context:component-scan>包扫描踩坑记录
公司项目配置的Spring项目的包扫描有点问题,出现了一个被Spring容器管理的Bean被创建了2次的现象.在此记录下解决的过程,方便后续查阅. 改动前: 容器启动监听器中会扫描全部包,创建 ...
- libgdx判断actor与circle是否重叠
实质是检测矩形与circle是否重叠 基本函数,判断点是否在circle中 public static boolean IsInside( float x, float y, Circle circl ...
- python中的and和or用法
在python中and和or返回的值并不是True和false这么简单.虽然他们看上去和c++中的&&和||有些相似.在了解and和or之前,我们先要了解python中的True和Fa ...
- Linux部署DotNetCore记录
一.背景 最近半年或最近三个月来,公司在计划大刀阔斧的规划重构新的产品.按目前的计划和宣传还是很令人期待的.前端预计应用现在很流行的前端框架,有Vue.ElementUI等,后端宣传了很多微服务.持续 ...
- CSS快速入门-组合选择器
<div class="gradefather"> hello1 <div class="father">hello2 <p cl ...
- node.js学习笔记(四)——EventEmitter
error 事件 EventEmitter 定义了一个特殊的事件 error,它包含了错误的语义,我们在遇到异常的时候通常会触发 error 事件.当 error 被触发时,EventEmitter ...
- 阿里云centos 安装禅道
下载 我的阿里云服务器系统是 centos6.8 64 位,下载的禅道版本是 Linux 64位一键安装包(适用于Linux 64位) 由于阿里云服务器没桌面,所以下载用不了浏览器,可考虑在本地下载后 ...