NOIP模拟·20141105题解
【A、韩信点兵】
结论题+模板题,用到了中国剩余定理,维基百科上讲的就比较详细,这里就不再赘述了……
对于这题,我们先利用中国剩余定理($x \equiv \sum{(a_i m_i (m_i^{-1} \mod p_i))}\, \mod (\prod{p_i})$)找到当前人数的最小可行解$x_0$,(如果$x_0$已经超过了$N$,直接输出无解即可)这时不难证明,对于任何一个可行解,都有 $$x_i = x_0 + k \times \prod{P_i},k \in \mathbb{N}$$
我们的目标是找到不超过$N$的最大可行解x',那么答案就是$N - x'$。注意这里如果直接枚举$k$的话有一个测试点会超时(看起来我的数据规模还是挺良心的……只卡掉了10分)。正确的做法是先用$N$减去$x_0$,这时剩下的部分就是$N - x' + k \times \prod{P_i},k \in \mathbb{N}$,那么我们只需用这个结果对$\prod{P_i}$取余即可得到答案。
2 #include <cctype>
3 #include <algorithm>
4 #include <cstring>
5 #include <queue>
6 #include <cmath>
7 #include <iostream>
8
9
typedef long long LL;
using namespace std;
inline int lowbit(int x){return x & -x;}
int gcd(int a, int b){return (!a) ? b : gcd(b % a, b);}
template<typename T>T exgcd(T a, T b, T &x, T &y){
, y = ; return b;}
T d = exgcd(b % a, a, y, x);
x -= (b/a) * y;
return d;
}
/*=====================================*/
inline LL inv(LL a, LL mod){
LL x, y;
);
return (x % mod + mod) % mod;
}
LL n, M = , N[], e, S = ;
], a[], m;
inline void init(){
cin >> n >> m;
;i < m;++i){
cin >> P[i] >> a[i];
M *= P[i];
}
;i < m;++i){
N[i] = M / P[i];
e = N[i] * inv(N[i], P[i]) % M;
S = (S + e * a[i]) % M;
}
}
inline void work(){
LL x, y;
exgcd<LL>(, M, x, y);
x = ((x * S % M) + M ) % M;
<< endl;return;}
cout << (n - x) % M << endl;
}
int main(){
#if defined DEBUG
freopen("test", "r", stdin);
#else
freopen("HanXin.in", "r", stdin);
freopen("HanXin.out", "w", stdout);
#endif
init();
work();
;
}
中国剩余定理
【B、月考统计】
经典模型——差分约束系统。设第i位同学的分数为$x_i$,所有同学的最低分数为0. 则统计表中的每条息$i,j,a_{ij}$都可以形式化为 $$x_i - x_j \le a_{ij}$$。
对于这样一组不等式,我们可以抽象化出图论模型:每个同学都抽象为一个节点,再设一个起点0,表示所有同学的最低分数。对于每个不等式$x_i - x_j \le a_{ij}$,我们都从点i到点j连一条权值为$-a_{ij}$的有向边,表示从起点到点j的最长路权和最少比起点到i的最长路权和大$-a_{ij}$(可以用最长路的三角形不等式证明)。对于这样的图,用spfa求出从起点到每个点的最长路权和就是答案。
2 /*======================================================Code by Asm.Def========================================================*/
3 /*=============================================================================================================================*/
4 #include <cstdio>
5 #include <iostream>
6 #include <algorithm>
7 #include <cmath>
8 #include <cctype>
9 #include <memory.h>
#include <vector>
#include <set>
#include <string>
#include <cstring>
#include <map>
#include <queue>
#include <deque>
#include <stack>
#include <ctime>
#include <iterator>
#include <functional>
#include <cstdlib>
using namespace std;
/*===================================================================================*/
#define forall(it,v) for(__typeof(v.begin()) it = v.begin();it < v.end();++it)
#define pb push_back
#define REP(i,j,k) for(i = j;i <= k;++i)
#define REPD(i,j,k) for(i = j;i >= k;--i)
#define iter(v) v::iterator
typedef long long LL;
template<typename T> void getint(T &x){
char c = getchar();
while(!isdigit(c))c = getchar();
x = c - ';
+ c - ';
}
/*============================================================================================*/
+ ;
int N, M;
struct edge{
int to, w;
edge(int T, int W):to(T), w(W){}
};
vector<edge> adj[maxn];
queue<int> Q;
};
}, cnt[maxn] = {};
inline void init(){
cin >> N >> M;
int i, x, y, a;
while(M--){
cin >> x >> y >> a;
adj[x].push_back(edge(y, -a));
}
;i <= N;++i)
Q.push(i);inQ[i] = ;cnt[i] = ;
}
inline void work(){
int i, t;
iter(vector<edge>) it;
while(!Q.empty()){
t = Q.front();Q.pop();inQ[t] = ;
for(it = adj[t].begin();it != adj[t].end();++it)
if(dis[t] + it->w > dis[it->to]){
dis[it->to] = dis[t] + it->w;
if(!inQ[it->to]){
if(cnt[it->to] == N){
cout << "SOMEONE LAY!" << endl;
return;
}
Q.push(it->to);inQ[it->to] = ;++cnt[it->to];
}
}
}
;i <= N;++i)
cout << dis[i] << ' ';
}
int main(){
#ifdef DEBUG
freopen("test", "r", stdin);
#else
freopen("ExamStat.in", "r", stdin);
freopen("ExamStat.out", "w", stdout);
#endif
init();
work();
#ifdef DEBUG
//cout << endl << (double)clock() / CLOCKS_PER_SEC <<endl;
#endif
;
}
spfa解差分约束
【C、神奇的压缩机】
神奇的压缩机,神奇的阅读题……
这题改编自第21场Andrew Stankevich's Contest(俄国的ACM多校训练赛)的Lempel-Ziv Compression……
当时我的解法是预处理出字符串中每个子串的“满足i小于子串长度且i前缀与i后缀相等的i”的最大值(或 原串的每个后缀的KMP-next数组)……听起来相当拗口,不过套用KMP的预处理过程可以降低思维难度。
2 // Submission Date: 2014-10-02 16:34:32
3 // Time: 8256MS
4 // Memory: 34624KB
5
6 /*======================================================Code by Asm.Def========================================================*/
7 #include <cstdio>
8 #include <iostream>
9 #include <algorithm>
#include <cmath>
#include <cctype>
#include <memory.h>
#include <cstring>
#include <cstdlib>
using namespace std;
#define maxn ((int)4.1e3)
typedef long long LL;
char ch[maxn];
, minbit[maxn], *next[maxn];
int l[maxn], r[maxn], str[maxn];
inline void getnext(int l){
int i, j, L = len - l;
next[l] = ];
int *Next = next[l];
Next[] = ;
;i < L;++i){
j = Next[i-] - ;
] && j >= )
j = Next[j] - ;
])
Next[i] = j + ;
;
}
}
void printpro(int i){
if(str[i] == i){
);
int j;
for(j = r[i];j <= i;++j)putchar(ch[j]);
return;
}
printpro(str[i]);
printf("(%d,%d)", r[i], l[i]);
}
int main(){
#ifdef DEBUG
assert(freopen("test","r",stdin));
#endif
char c;
while(isalpha(c = getchar()))str[len] = len, ch[len++] = c;
int i, j, Min, t;
;i < len - ; ++i)
getnext(i);
minbit[] = ;
;i < len; ++i){
Min = 0x7fffffff;
;j < i;++j)
< Min){
Min = minbit[j] + (i-j)*;
str[i] = i;
r[i] = j+;
}
;j < i; ++j){
t = next[j][i-j];
if(!t)continue;
< Min){
Min = minbit[i-t] + ;
str[i] = i-t;
r[i] = i+-t-j;
l[i] = t;
}
}
minbit[i] = Min;
}
printf(]);
printpro(len-);
;
}
动态规划
NOIP模拟·20141105题解的更多相关文章
- 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程
数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...
- 「题解」NOIP模拟测试题解乱写II(36)
毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...
- HZOJ 20190818 NOIP模拟24题解
T1 字符串: 裸的卡特兰数题,考拉学长讲过的原题,就是bzoj3907网格那题,而且这题更简单,连高精都不用 结论$C_{n+m}^{n}-C_{n+m}^{n+1}$ 考场上10min切掉 #in ...
- 「题解」NOIP模拟测试题解乱写I(29-31)
NOIP模拟29(B) T1爬山 简单题,赛时找到了$O(1)$查询的规律于是切了. 从倍增LCA那里借鉴了一点东西:先将a.b抬到同一高度,然后再一起往上爬.所用的步数$×2$就是了. 抬升到同一高 ...
- HGOI NOIP模拟4 题解
NOIP国庆模拟赛Day5 题解 T1 马里奥 题目描述 马里奥将要参加 NOIP 了,他现在在一片大陆上,这个大陆上有着许多浮空岛,并且其中一座浮空岛上有一个传送门,马里奥想要到达传送门从而前往 N ...
- [NOIP模拟13]题解
A.矩阵游戏 其实挺水的? 考场上根本没有管出题人的疯狂暗示(诶这出题人有毛病吧这么简单的东西写一大堆柿子),而且推公式能力近乎没有,所以死掉了. 很显然乘法有交换率结合率所以操作顺序对最终结果没什么 ...
- 8.3 NOIP 模拟12题解
话说这次考试T1和T2是真的水,然而T1CE,T2TLE,T3CE 这不就是在侮辱我的智商啊!之前本机编译都是c++,以后要用c++11. 这次的T1就是一个大型找规律,我的规律都找出来了,但是竟然用 ...
- HZOJ 20190819 NOIP模拟26题解
考试过程: 照例开题,然后觉得三道题都挺难,比昨天难多了(flag×1),T1 dp?T2 数据结构? T3 dp?事实证明我是sb然后决定先搞T2,但是,woc,这题在说什么啊,我怎么看不懂题啊,连 ...
- [NOIP模拟26]题解
今天的考试题改自闭了……所以滚来写陈年题解. A.*****贪婪***** RT,出题人告诉我们这题要贪心. 最优的策略一定是拖到必须断的时候再断开(虽然并不知道为什么). 如果一段序列满足题目中的性 ...
随机推荐
- Spring Boot:定制自己的starter
在学习Spring Boot的过程中,接触最多的就是starter.可以认为starter是一种服务——使得使用某个功能的开发者不需要关注各种依赖库的处理,不需要具体的配置信息,由Spring Boo ...
- 函数导出在kvm_intel.ko,kvm.ko不共享
KVM一共包含了三个内核模块,kvm_intel.ko,kvm_amd.ko,kvm.ko.其中两个重要文件x86.c和vmx.c在编译后分别会生成kvm_intel.ko和kvm.ko两个内核模块, ...
- Linux 入门记录:十八、Linux 系统启动流程 + 单用户修改 root 密码 + GRUB 加密
一.系统启动流程 一般来说,Linux 系统的启动流程是这样的: 1. 开机之后,位于计算机主板 ROM 芯片上的 BIOS 被最先读取,在进行硬件和内存的校验以及 CPU 的自检没有异常后, BIO ...
- (十九)git版本管理软件——搭建git服务器
创建管理员git 为管理员用户添加sudo权限 生成管理员秘钥 设置管理员git提交账号和邮箱 下载安装gitolite 启动gitolite 添加项目版本库 添加项目成员 项目成员下载项目 gito ...
- c++设计模式系列----builder模式
看了好几处关于builder模式的书和博客,总感觉不是很清楚,感觉不少书上的说的也不是很准确.最后还是看回圣经<设计模式>.看了好久终于感觉明白了一点了. 意图: builder模式提出的 ...
- 1002: 当不成勇者的Water只好去下棋了---课程作业---图的填色
1002: 当不成勇者的Water只好去下棋了 Time Limit: 1 Sec Memory Limit: 128 MB Description 由于魔王BOSS躲起来了,说好要当勇者的Wate ...
- UVALive 7040 Color
题目链接:LA-7040 题意为用m种颜色给n个格子染色.问正好使用k种颜色的方案有多少. 首先很容易想到的是\( k * (k-1)^{n-1}\),这个算出来的是使用小于等于k种颜色给n个方格染色 ...
- Python-生成器/你不知道的点
1.什么是生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素, ...
- java中this的用法如:this.name=name
package com.chensi; /** * 这个是为了搞懂那个 this.name = name的. * @author ZHL * */ public class ThisTestZhl { ...
- experss 做小型服务器出现跨域问题
情况是这样的 我用express做一个小型的服务器来做我demo项目的一个接口 然后我就出现了跨域问题 然后我就 app.all('/*', function(req, res, next) { // ...