Mdoi R2 洛谷4月月赛I
Mdoi R2 洛谷4月月赛I DIV2
A Car
题目描述
在MDOI市, 为了推行环保, 一辆车是否被限行的依据时车牌号和当天的日期。
车牌号的编码方式是这样的:
**·**前三位均为大写字母, 表示所在的地区。
·后五位为大写字母或数字, 为识别码保证至少有一个数字。
**·**车牌号的尾号是从右往左的u哦个数字。
MdOI市在本题的编码方式下前3为是MDA。例如, MdOI市有一辆识别码为6780p的车, 他的车牌号就是MDA6780p尾号是0.
在MdOI市, 车辆限行规则如下:
1.对于外来车( 即前三位编号非MDA).工作日(星期一至星期五)均限行。
2.对于其他本地车, 每天会限行某些尾号的汽车。周一到周五的限行尾号如下:
日期 | 星期一 | 星期二 | 星期三 | 星期四 | 星期五 |
---|---|---|---|---|---|
限行尾号 | 1和9 | 2和8 | 3和7 | 4和6 | 5和0 |
小 C 告诉了你她的车牌号,她想知道,她的车在星期一到星期五中的哪些日期会被限行。请你帮帮她。
题目思路
纯模拟, 注意字母和数字的转化。还有尾号与日期的一一对应, 如果不是这个城市的车, 输出5个1.
代码
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<stack>
#include<queue>
#include<deque>
#include<cstdlib>
#include<ctime>
#include<cctype>
#include<list>using namespace std;string s;
int last;
map<int, int>mp;
int main()
{for(int i = 1; i <= 5; i++){mp[i] = i;mp[10-i] = i;}mp[0] = 5;cin >> s;for(int i = s.size() - 1; i >= 3; i--){if('0' <= s[i] && s[i] <= '9'){last = s[i] - '0';break;}}if(s[0] != 'M' || s[1] != 'D' || s[2] != 'A'){printf("%d %d %d %d %d\n", 1, 1, 1, 1, 1);return 0;}for(int i = 1; i <= 5; i++){if(i == mp[last]){printf("%d ", 1);}else{printf("%d ", 0);}}cout << endl;return 0;
}
B Mayuri
题目描述
在离开这个世界前,万由里想要寻找属于她的 Lucky Number。
万由里会给出一数a, 以及一个长度为b的01串S。
简单地说, 她的Lucky number 是满足以下条件的正整数n:
· n的位数为b且n不含前导0.
· 若S的第i位为1, 则n的前i为组成的数是a的倍数, 否则不是。
对于一个数, 前i位组成的数是指这个数前i个数码依次拼接形成的数。如312311前3位组成的为312, 前5位位31231.
现在, 请你帮助万由里计算一下, 他的Lucky Number 是多少。
由于满足条件的数有多个, 输出最小的一个。若不存在, 输出*-1*。
题目思路
假如说有3位, a为3。当前的数字前两位为30.S的最后一位是1。
那么就应该填0.
如果S最后一位是0.
那么就应该填1.
可见前i位组成的数中, 假设前j位被整除, 那么其实只要考虑剩下的i-j位即可。
所以我们设一个数now, 从高位向低位依次在S字符串的前提下找最小的数。因为最小, 所以从0开始, 一直到9, 如果这一位哪个都不能填, 直接输出-1.
还有, 如果这一位添加到now后被a整除的话, 那么清0, 因为后面的判断他起不了作用, 否则now * 10 + 当前位数。
还有注意第一位不能从0枚举。
对了, 特判a = 10, S长度为1的情况。
代码
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<stack>
#include<queue>
#include<deque>
#include<cstdlib>
#include<ctime>
#include<cctype>
#include<list>using namespace std;int a, b;
string s;
int c[100010];
int main()
{cin >> a >> b;cin >> s;if(a == 10 && b == 1){cout << -1 << endl;return 0;}for(int i = 0; i < s.size(); i++){c[i+1] = s[i] - '0';}long long now = 0; char ans[100010];int t = 0;for(int i = 1; i <= s.size(); i++){now *= 10;int cnt = 0;if(c[i] == 1){for(int j = 0; j < 10; j++){long long nowi = now + j;if(nowi % a == 0){if(i == 1){if(nowi < a){cnt++;continue;}}ans[++t] = j+'0';now = 0;break;}else{++cnt;continue;}}}else{for(int j = 0; j < 10; j++){long long nowi = now + j;if(nowi % a == 0){ ++cnt;continue;}else{now = nowi;ans[++t] = j + '0';break;}}} if(cnt == 10){cout << -1 << endl;return 0;}}//long long nowi = now;//while(nowi != 0)//{// rev[++q] = nowi%10;// nowi /= 10;//}//for(int k = q; k >= 1; k--)//{// ans[++t] = rev[k] + '0';//}for(int i = 1; i <= t; i++){cout << ans[i];}cout << endl;return 0;
}
C Odyssey
题目描述
若正整数a, b, 满足:
存在正整数c使得ab=ckab = c^kab=ck。
则称(a,b)(a, b)(a,b)为完美数对。
有一个包含n个节点和m条边的有向无环图, 这张图中的每条边都有权值和长度两个属性。
如果一条路径P满足以下条件之一, 则称其为一条完美路径:
- P中仅包含一条边。
- P从起点开始依次为e1,e2,e3,...epe_1,e_2,e_3,...e_pe1,e2,e3,...ep这p(p≥2)p(p\ge2)p(p≥2)条边, 对于任意的1≤i≤p−11\le i \le p-11≤i≤p−1, eie_iei的权值和ei−1e_{i-1}ei−1的权值组成完美数对。
你需要求出途中最长完美路径的长度, 一条路径长度定义为这条路径上所有边长度之和 。
题目思路
发现一个性质, 其实每一个数, 他的对应的完美数对的公共因子都有一个是相同的p, 使得每个数都是p的k次方的方。所以我们可以找出那个相应的可以成完美数对的数.
如果想让这个数唯一怎么办, 取模!!!
首先质因数分解。拆成p1a1×p2a2....×pSaSp_1^{a_1} \times p_2^{a_2} .... \times p_S^{a_S}p1a1×p2a2....×pSaS的形式。如 16 = 24;
然后对指数取模, 模数为k, 如k = 3时, 24%3 = 2;
而能与 2 构成完美数对且所有指数都小于等于 2 的数只有4;
所以这个数首先他的指数要小于模数, 然后这个数与取模后的数相乘等于ck, 显然这个数唯一。
检验:16∗4=64=4316 * 4 = 64 = 4^316∗4=64=43, 符合条件。
对于每条边, 他的权值我们都按以上方式处理。然后记到f数组中去。
即f[16] = 4; f[4] = 16;接着,对于每个i和f[i], 跑一层拓扑排序, 再建图的时候建分层图, 防止原来的长度和新确定的长度混掉, 开点的时候接在n点的后面, 则1点对应的点为1+n, 同理,2点为n+2, 以此类推。1点的权值为w, 则1+n就为f[w], 同时,长度赋值为1到2点的长度, 还有, 1+n到2点也赋值上相同的长度, 在这上面进行拓扑排序即可。
代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){register int x=0;register bool f=0;register char c=getchar();while(c<'0'||c>'9'){if(c=='-') f=1;c=getchar();}while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+c-48;c=getchar();}return f?-x:x;
}
char cr[200];int tt;
inline void print(register int x,register char k='\n') {if(!x) putchar('0');if(x < 0) putchar('-'),x=-x;while(x) cr[++tt]=x%10+'0',x/=10;while(tt) putchar(cr[tt--]);putchar(k);
}
const int maxn=233333;
const int lim=100000;
struct edge{int from,to,nxt,lg;
}e[maxn<<1];
vector<edge>g[maxn];
int n,m,k,f[maxn];
int h[maxn],pri[maxn];
bool vis[lim+5];
void xxs(){for(int i=2;i<=maxn;++i){if(!vis[i]) pri[++pri[0]]=i;for(int j=1;j<=pri[0]&&pri[j]*i<=lim;j++){vis[pri[j]*i]=1;if(i%pri[j]==0){break;}}}
}
void work(int u,int v,int w,int l){int res1=1,res2=1;for(int i=1;pri[i]*pri[i]<=w;i++) {int tmp=0;while(w%pri[i]==0){tmp++;w/=pri[i];}if(tmp%k){for(int j=1;j<=tmp%k;j++){res1*=pri[i];}for(int j=1;j<=k-tmp%k;j++){if(res2*pri[i]>lim){return;}res2*=pri[i];}}}if(k!=1)res1*=w;for(int j=2;j<=k;j++){if(res2*w>lim){return;}res2*=w;}f[res1]=res2;f[res2]=res1;g[res1].push_back((edge){u,v,0,l});
}
queue<int> q;
int dp[maxn];
int cnt=1;
void add(int x,int y,int z) {e[++cnt].nxt=h[x];e[cnt].to=y;e[cnt].lg=z;h[x]=cnt;return;
}
int in[maxn],ans;
void topo(int w){while(!q.empty())q.pop();for(edge v:g[w]){in[v.to+n]++;add(v.from,v.to+n,v.lg);}for(edge v:g[f[w]]){in[v.to]++;add(v.from+n,v.to,v.lg);}for(edge v:g[w]){if(!in[v.from]) q.push(v.from),in[v.from]=999999999;}for(edge v:g[f[w]]){if(!in[v.from+n]) q.push(v.from+n),in[v.from+n]=999999999;}while(!q.empty()){int u=q.front();q.pop();for(int i=h[u];i;i=e[i].nxt){int v=e[i].to,l=e[i].lg;dp[v]=max(dp[v],dp[u]+l);ans=max(ans,dp[v]);in[v]--;if(!in[v]) q.push(v);}}for(edge v:g[f[w]]){dp[v.from]=dp[v.from+n]=dp[v.to]=dp[v.to+n]=0;h[v.from]=h[v.from+n]=h[v.to]=h[v.to+n]=0;in[v.from]=in[v.from+n]=in[v.to]=in[v.to+n]=0;}for(edge v:g[w]){dp[v.from]=dp[v.from+n]=dp[v.to]=dp[v.to+n]=0;h[v.from]=h[v.from+n]=h[v.to]=h[v.to+n]=0;in[v.from]=in[v.from+n]=in[v.to]=in[v.to+n]=0;}cnt=1;
}
signed main(){n=read();m=read();k=read();memset(f,-1,sizeof(f));xxs();f[0]=0;for(int i=1;i<=m;++i){int u=read(),v=read(),w=read(),l=read();ans=max(ans,l);work(u,v,w,l);}for(int i=1;i<=lim;i++){if(f[i]>=0 && f[i]>=i){topo(i);}}print(ans);return 0;
}
D Resurrection
题解
Mdoi R2 洛谷4月月赛I相关推荐
- 「LuoguP4995」「洛谷11月月赛」 跳跳!(贪心
题目描述 你是一只小跳蛙,你特别擅长在各种地方跳来跳去. 这一天,你和朋友小 F 一起出去玩耍的时候,遇到了一堆高矮不同的石头,其中第 ii 块的石头高度为 h_ihi,地面的高度是 h_0 = 0 ...
- 洛谷10月月赛 2 t2 深海少女与胖头鱼
洛谷10月月赛 2 t2 深海少女与胖头鱼 题目链接 参考资料:洛谷10月赛2讲评ppt; 本篇题解考完那天就开始写,断断续续写到今天才写完 本题作为基础的期望dp题,用来学习期望dp还是很不错的 ( ...
- 洛谷 2 月月赛 I 『MdOI R4』 (Div2) A ~ D 四题全,也许会有六题,超高质量题解 (Div.1E、F下辈子一定补)【每日亿题2 / 9】
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A.P7337 『MdOI R4』Fun B.P7338 『MdOI R4』Color C.P7 ...
- 洛谷11月月赛(284pts rank85)
https://www.luogu.org/contestnew/show/12006 我是比赛完后在去写的 这是我第一次打洛谷月赛,之前一次是比赛完才去看而且写了第一题就没写后面的了 284分,太水 ...
- P8318 『JROI-4』淘气的猴子(【LGR-108】洛谷 5 月月赛 I JROI R4 Div.2)
众所周知,jockbutt 是一个可爱的女孩纸. 题目描述 jockbutt 有一个正整数序列,长度为 n,分别为 a1,a2...an,她非常喜欢这个序列,平时都非常爱惜它们. 可是有一天,当 jo ...
- 【洛谷月赛】洛谷11月月赛·Day1
洛谷2614 计算器弹琴 本题地址: http://www.luogu.org/problem/show?pid=2614 题目描述 总所周知,计算器可以拿来干很多它本不应该干的事情,比如写作文.(参 ...
- CONTEST199 [有奖]洛谷8月月赛题解
http://www.luogu.org/contest/show?tid=199 T1: 集合求和 可以找一下规律,对于一个包含n个元素的集合,每个元素在所有子集中出现的次数均为2^(n-1),将s ...
- 洛谷10月月赛Round.1| P3399 丝绸之路 [DP]
题目背景 张骞于公元前138年曾历尽艰险出使过西域.加强了汉朝与西域各国的友好往来.从那以后,一队队骆驼商队在这漫长的商贸大道上行进,他们越过崇山峻岭,将中国的先进技术带向中亚.西亚和欧洲,将那里的香 ...
- 洛谷2017-2月月赛
打CF前随便打打,看了一眼只会做签到题,还挂了一次,95/400. A.富金森林公园 题目大意:给一个长度为n的数列,支持两种操作:1.修改一个数的值:2.给出一个k,问有多少段数大等于k.(N< ...
最新文章
- HTTP Status 405 - HTTP method POST is not supported by this URL
- MWeb 的基本使用
- 高人写的浙大简史(转)
- martingale、markov chain、Monte Carlo、MCMC
- 魔兽世界客户端数据研究(三)
- Hadoop Jobhistory配置启用
- mysql图片_往MySQL中存储图片的方法
- socket结构和几个IP地址转换函数
- python矩阵赋值提高速度_Numpy大规模矩阵运算优化加速技巧
- maven配置aliyun仓库地址
- DeepMind作弊?被质疑干翻星际2顶尖高手全靠手速
- codevs 1422 河城荷取
- Spring Boot实战笔记(一)-- Spring简介
- linux shell脚本 定义变量,Shell脚本应用 - 编制shell脚本、shell变量
- dedecms注入漏洞 5.3 5.5
- 《鸟哥的Linux私房菜》学习笔记(8)——bash脚本编程之变量
- ​SQL注入非常详细总结
- 论文关于mysql数据库文献_数据库论文参考文献
- css样式,鼠标移动上去变成禁用、小手等样式。
- 加拿大程序员趣闻系列 1_N,kotlin循环