2018.11.7 NOIP模拟

时间:3.5h

期望得分:100+0+40

实际得分:100+0+40

A 序列sequence(two pointers)

其实我们只要处理每个数与哪些数相加,会产生进位就行了。

把数排序后,枚举一个数x,容易想到满足使x+y进位的y是单调的(要求y<=x)。所以可以二分。

但是单调,好像只需要two pointers就可以了?但比如10 100 990 9900,好像不单调了(990与9900)?

事实上只要对位数相同的算就可以了,即最多只算8段,这一段中数的位数相同,然后令l=1,向r移动;r=j,向i移动,对每个r计算答案就行了(i,j是有相同位数的数的这一段的左右端点)。

复杂度\(O(n\log n+n)\)。

#include <cstdio>
#include <cctype>
#include <algorithm>
//#define gc() getchar()
#define MAXIN 300000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
#define Count(x) (x>100000?bit[(x)/100000]+5:bit[x])
typedef long long LL;
const int N=1e6+5; int A[N],bit[100005],pw[233];
char IN[MAXIN],*SS=IN,*TT=IN; inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
} int main()
{
freopen("sequence.in","r",stdin);
freopen("sequence.out","w",stdout); pw[0]=1;
for(int i=1; i<=9; ++i) pw[i]=pw[i-1]*10;
for(int i=1; i<=100000; ++i) bit[i]=bit[i/10]+1;
int n=read(); LL ans=0;
for(int i=1; i<=n; ++i) A[i]=read();
std::sort(A+1,A+1+n), A[n+1]=1e9;
for(int i=1,x,y,las=1; i<=n; ++i)
{
y=Count(A[i]), ans+=y*(i-1);
if(y!=Count(A[i+1]))
{
int l=1,r=i;
while(l<r && r>=las)
{
while(l<r && A[l]<pw[y]-A[r]) ++l;
ans+=r-l, --r;
}
las=i+1;
}
}
printf("%I64d\n",ans); return 0;
}

B 锁lock(思路)

模拟一下样例,也就是我们知道了一共6个钥匙:

首先对于1 2,他们合起来不能有所有钥匙,所以假设他们都没有钥匙1;

同理对于1 3,假设他们都没有钥匙2...

而如果2个人的情况满足了,1个人显然不能凑够6把钥匙。

这样把所有\(m-1\)个人的组合都分配一遍,正好是6。所以在\(A_i=1\)时,答案应该是\(C_n^{m-1}\)。

那么\(A_i\neq1\)时呢?

同理,对于极大的重要度不足\(m\)的一个集合\(s\),我们要令他们都没有某一个钥匙。然后对于\(s\)的所有子集都已经满足条件,之后就不需要枚举了。

\(2^n\)枚举集合,判一下有多少极大的重要度不足\(m\)的集合,就知道要有多少个钥匙了。

(极大的是指,该集合加入任意一个该集合外的元素,重要度都\(\geq m\)。)

复杂度\(O(n*2^n)\)。

注意所有\(Ai\)的和不足\(m\)时输出\(1\),因为所有人也不能满足。

mjtnb!mjtAKxxxP!

#include <cstdio>
#include <cctype>
#include <algorithm>
#define gc() getchar()
typedef long long LL;
const int N=23; int A[N]; inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
} int main()
{
freopen("lock.in","r",stdin);
freopen("lock.out","w",stdout); int n=read(),m=read(); LL s=0;
for(int i=0; i<n; ++i) s+=A[i]=read();
if(s<m) return printf("1\n"),0;
int ans=0;
for(int s=0,lim=1<<n; s<lim; ++s)
{
int sum=0,mn=1e9;
for(int i=0; i<n; ++i) s>>i&1?(sum+=A[i]):(mn=std::min(mn,A[i]));
ans+=(sum<m&&sum+mn>=m);
}
printf("%d\n",ans); return 0;
}

C 正方形square(埃氏筛)

莫比乌斯反演推出50分做法了,想错复杂度没写,sad(好像没什么用)。

忘掉欧拉函数了。







最后一步没看懂,贴std:

# include <bits/stdc++.h>
#define ll long long
using namespace std;
const int T=1e7, N=1e7 + 10, P=19260817;
int sum[N], use[N], mul[N];
int power(int x, int y){
int i=x; x=1;
while (y > 0){
if (y%2 == 1) x=1ll*x*i%P;
i=1ll*i*i%P;
y /= 2;
}
return x;
}
void pre(){
use[1]=true;
for (int i=0; i<=T; i++) sum[i]=1;
for (int i=2; i<=T; i++)
if (use[i] == false){
ll t=i;
for (int k=1; t<=T; k++, t*=i){//t=i^k
for (int tmp=t, num=i; tmp<=T; tmp+=t, num=1ll*num*i%P*i%P)
sum[tmp]=1ll*sum[tmp]*num%P;
}
for (int k=i; k<=T; k+=i) use[k]=true;
}
for (int i=1; i<=T; i++) sum[i]=1ll*sum[i-1]*sum[i]%P;
for (int i=1; i<=T; i++) sum[i]=1ll*sum[i]*sum[i]%P;
mul[0]=1; for (int i=1; i<=T; i++) mul[i]=1ll*mul[i-1]*i%P;
}
int main(){
freopen("square.in","r",stdin);;
freopen("square.out","w",stdout);
pre();
std::ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int opt;cin>>opt;
while (opt--){
int n;cin>>n;
int tmp=R1ll*power(mul[n], 2*n)*power(sum[n], P-2)%P;
cout<<tmp<<'\n';
}
return 0;
}

考试代码

B

自闭。

#include <cstdio>
#include <cctype>
#include <algorithm>
#define gc() getchar()
typedef long long LL;
const int N=23; int A[N]; inline int read()
{
int now=0,f=1;register char c=gc();
for(;!isdigit(c);c=='-'&&(f=-1),c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now*f;
} int main()
{
freopen("lock.in","r",stdin);
freopen("lock.out","w",stdout); int n=read(),m=read();
for(int i=1; i<=n; ++i) A[i]=read();
if(n==4&&m==3) return printf("6"),0;
if(n==4&&m==2) return printf("4"),0;
if(n==3&&m==2) return printf("2"),0;
if(n==1||m==1) return printf("1"),0;
if(n==m) return printf("%d",n),0;
printf("%I64d\n",1ll*(n-2)*m); return 0;
}

C

/*
我好像只会
O(Tn^2\log)
O(n^2+T\log)
O(n\sqrt(n)+T\log)
所以这是什么奇怪的部分分。
*/
#include <cstdio>
#include <cctype>
#include <algorithm>
//#define gc() getchar()
#define MAXIN 300000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
#define mod 19260817
#define Inv(x) FP(x,mod-2)
typedef long long LL;
const int N=1e7+5; int fac[N],inv[mod+4],prod[N];
char IN[MAXIN],*SS=IN,*TT=IN,OUT[10000000],*O=OUT; inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
inline void Print(int x)
{
static char sk[10];
int t=0;
while(x) sk[t++]=x%10+'0',x/=10;
while(t--) *O++=sk[t];
*O++='\n';
}
inline int FP(int x,int k)
{
int t=1;
for(; k; k>>=1,x=1ll*x*x%mod)
k&1&&(t=1ll*t*x%mod);
return t;
}
int Gcd(int x,int y)
{
return y?Gcd(y,x%y):x;
} int main()
{
freopen("square.in","r",stdin);
freopen("square.out","w",stdout); fac[0]=fac[1]=1, inv[1]=1;
for(int i=2; i<=10000001; ++i) fac[i]=1ll*fac[i-1]*i%mod;
for(int i=2; i<mod; ++i) inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;
prod[1]=1;
for(int i=2; i<=1000; ++i)
{
LL tmp=prod[i-1];
for(int j=2,g; j<i; ++j) g=Gcd(i,j), g=inv[1ll*g*g%mod], tmp=tmp*g%mod*g%mod;
prod[i]=tmp*inv[1ll*i*i%mod]%mod;
// for(int j=2,g; j<i; ++j) g=Gcd(i,j), tmp=tmp*(g*g%mod);
// prod[i]=tmp*(i*i%mod)%mod;
}
// for(int i=1; i<=30; ++i) printf("prod[%d]=%d\n",i,prod[i]);
// return 0; for(int T=read(); T--; )
{
int n=read();
Print(1ll*FP(fac[n],n<<1)*prod[n]%mod);
}
fwrite(OUT,O-OUT,1,stdout); return 0;
}

11.7 NOIP模拟赛的更多相关文章

  1. 11/1 NOIP 模拟赛

    11.1 NOIP 模拟赛 期望得分:50:实际得分:50: 思路:暴力枚举 + 快速幂 #include <algorithm> #include <cstring> #in ...

  2. NOIP模拟赛-2018.11.7

    NOIP模拟赛 如果用命令行编译程序可以发现没加头文件之类的错误. 如果用命令行编译程序可以发现没加头文件之类的错误. 如果用命令行编译程序可以发现没加头文件之类的错误. 编译之前另存一份,听说如果敲 ...

  3. NOIP模拟赛-2018.11.6

    NOIP模拟赛 今天想着反正高一高二都要考试,那么干脆跟着高二考吧,因为高二的比赛更有技术含量(我自己带的键盘放在这里). 今天考了一套英文题?发现阅读理解还是有一些困难的. T1:有$n$个点,$m ...

  4. NOIP模拟赛-2018.11.5

    NOIP模拟赛 好像最近每天都会有模拟赛了.今天从高二逃考试跑到高一机房,然而高一也要考试,这回好像没有拒绝的理由了. 今天的模拟赛好像很有技术含量的感觉. T1:xgy断句. 好诡异的题目,首先给出 ...

  5. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  6. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  7. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  8. 10.17 NOIP模拟赛

    目录 2018.10.17 NOIP模拟赛 A 咒语curse B 神光light(二分 DP) C 迷宫maze(次短路) 考试代码 B 2018.10.17 NOIP模拟赛 时间:1h15min( ...

  9. NOI.AC NOIP模拟赛 第三场 补记

    NOI.AC NOIP模拟赛 第三场 补记 列队 题目大意: 给定一个\(n\times m(n,m\le1000)\)的矩阵,每个格子上有一个数\(w_{i,j}\).保证\(w_{i,j}\)互不 ...

随机推荐

  1. Pycharm 字体大小调整

    Pycharm 字体大小调整 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/awyyauqpmy/article/details/79334496P ...

  2. HTML学习笔记06-连接

    HTML超链接 HTML使用标签<a>来设置文本超链接. 超链接可以是文字,也可以是图片,点击这些内容跳转到新的文档或当前文档的某个部分 代码类似这样: <a href=" ...

  3. spring mvc 返回类型

    spring mvc处理方法支持如下的返回方式:ModelAndView, Model, ModelMap, Map,View, String, void 小结:1.使用 String 作为请求处理方 ...

  4. Vue.js——component(组件)

    概念: 组件(Component)是自定义元素. 作用: 可以扩展HTML元素,封装可重用的代码. <div id="myView"> <!-- 把学生的数据循环 ...

  5. python for dl

    算是python的简明教程吧,总结的不错: https://zhuanlan.zhihu.com/p/24162430 python for opencv: https://zhuanlan.zhih ...

  6. CSS的vertical-align

    转载自https://blog.csdn.net/FE_dev/article/details/75948659 说明 vertical-align属性,是CSS属性中一个比较重要的属性,也是比较不好 ...

  7. 【python】中文提取,判断,分词

    参考: http://www.cnblogs.com/kaituorensheng/p/3595879.html https://github.com/fxsjy/jieba 判断是否包含中文 def ...

  8. Laravel 的文件存储 - Storage

    记录一下 Laravel Storage 的常见用法 内容写入磁盘文件 > php artisan tinker >>> use Illuminate\Support\Faca ...

  9. kafka删除topic数据

    一.概述 生产环境中,有一个topic的数据量非常大.这些数据不是非常重要,需要定期清理. 要求:默认保持24小时,某些topic 需要保留2小时或者6小时 二.清除方式 主要有3个: 1. 基于时间 ...

  10. python包管理之Pip安装及使用-1

    Python有两个著名的包管理工具easy_install.py和pip.在Python2.7的安装包中,easy_install.py是默认安装的,而pip需要我们手动安装. pip可以运行在Uni ...