博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Contest 1
阅读量:5243 次
发布时间:2019-06-14

本文共 2534 字,大约阅读时间需要 8 分钟。

  A:注意到模数是要求lcm的数的倍数,直接先取模就可以了。考场脑抽,对其质因数分解判了一下每个因子有没有,当然也行。

#include
#include
#include
#include
#include
#include
using namespace std;int read(){ int x=0,f=1;char c=getchar(); while (c<'0'||c>'9') { if (c=='-') f=-1;c=getchar();} while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar(); return x*f;}#define P 1234567890int a=246913578;int a2,a9,a3607,a3803,aP;int gcd(int n,int m){ return m==0?n:gcd(m,n%m);}int main(){ freopen("lcm.in","r",stdin); freopen("lcm.out","w",stdout); char c=getchar(); while (c>='0'&&c<='9') { int x=c^48; a2=x&1; a9=(a9*10+x)%9; a3607=(a3607*10+x)%3607; a3803=(a3803*10+x)%3803; aP=(10ll*aP+x)%P; c=getchar(); } if (a2) aP=2ll*aP%P; if (a3607) aP=3607ll*aP%P; if (a3803) aP=3803ll*aP%P; if (a9) if (a9%3==0) aP=3ll*aP%P; else aP=9ll*aP%P; cout<
View Code

  B:学傻系列。排列计数一般将数从小到大加进去考虑,于是设f[i][j]为i个数的排列其中有j个位置不合法的方案数,考虑每次往里加i+1,可以发现如果在上升段每个数的左侧或下降段每个数的右侧插入会使不合法位置--,反之则++。特殊情况是开头的下降段和结尾的上升段,于是增加二维01记录。正解考虑最大值出现位置于是变成了优美的卷积形式。当然原题n只有1000我的辣鸡dp也能A了。

#include
#include
#include
#include
#include
#include
using namespace std;int read(){ int x=0,f=1;char c=getchar(); while (c<'0'||c>'9') { if (c=='-') f=-1;c=getchar();} while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar(); return x*f;}#define N 1010int n,m,f[N][N][2][2]; //head tail up 0 down 1void inc(int &x,int y){x+=y;if (x>=m) x-=m;}int main(){ freopen("irrev.in","r",stdin); freopen("irrev.out","w",stdout); n=read(),m=read(); if (n==1) {cout<<1;return 0;} if (n==2) {cout<<2;return 0;} f[3][0][1][0]=2,f[3][0][0][1]=2,f[3][1][0][0]=1,f[3][1][1][1]=1; for (int i=3;i
View Code

  C:找规律容易发现系数是组合数。(伪)扩展lucas或者质因数分解都可以。

#include
#include
#include
#include
#include
#include
using namespace std;int read(){ int x=0,f=1;char c=getchar(); while (c<'0'||c>'9') { if (c=='-') f=-1;c=getchar();} while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar(); return x*f;}#define N 1050#define P 100007 int n,m,a[N],f[2][N],C[N],C0[2][N],fac[2][N],inv[2][N]; int lucas(int x,int n,int m,int p){ if (m>n) return 0; if (n
=1&&i-j<=m;j--) x=(x+1ll*C[i-j]*a[j]%P)%P; cout<
<
View Code

   result:300 rank1

转载于:https://www.cnblogs.com/Gloid/p/9734755.html

你可能感兴趣的文章
Github.com上有哪些比较有趣的PHP项目?
查看>>
SQL中Group By的使用详解
查看>>
架构之微服务设计
查看>>
vue route 跳转
查看>>
Source Insight常用快捷键及注释快捷键设置
查看>>
基于tiny4412的Linux内核移植(支持device tree)(一)
查看>>
Device Tree Usage
查看>>
Python基础【day02】:字符编码(一)
查看>>
sample
查看>>
React 深入学习:ReactCreateRef
查看>>
Python: NumPy, Pandas学习资料
查看>>
十年感悟之 python之路
查看>>
mongodb 备份与还原操作
查看>>
如何在 Linux 中查找最大的 10 个文件
查看>>
centos7.x安装docker-ce
查看>>
VM虚拟机安装Win10 系统黑屏
查看>>
docker IPv4 forwarding is disabled. 解决方法
查看>>
ansible 远程执行时提示 command not found 问题
查看>>
centos 7 下升级自带 sqlite3
查看>>
Spring Security的核心拦截器
查看>>