ACM-ICPC 2018 青岛赛区现场赛 D. Magic Multiplication && ZOJ 4061 (思维+构造)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4061

题意:定义一个长度为 n 的序列 a1,a2,..,an 和长度为 m 的序列 b1,b2,..,bm 所构成的新序列 c 为 a1b1,a1b2,....,anbm,给出最终的序列和两个初始序列的长度,构造出字典序最小的初始序列。

题解:首先我们知道两个个位数相乘最多可以得到两位数,易知最终序列的第一个数字 c1 的构造一定有 a1 的参与,当 a1 <= c1 时或者 c1 == 0时,a1 * b1 必须为个位数;否则 a1 * b1 必须为两位数,容易证明其正确性。有了这个性质以后,可以通过枚举 a1 得到完整的 b 序列,然后通过 b 序列再得出 a 序列。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define ull unsigned long long
 5 #define mst(a,b) memset((a),(b),sizeof(a))
 6 #define mp(a,b) make_pair(a,b)
 7 #define pi acos(-1)
 8 #define pii pair<int,int>
 9 #define pb push_back
10 const int INF = 0x3f3f3f3f;
11 const double eps = 1e-6;
12 const int MAXN = 2e5 + 10;
13 const int MAXM = 1e8 + 10;
14 const ll mod = 1e9 + 7;
15
16 int n,m,len;
17 char s[MAXN];
18 int a[MAXN],b[MAXN],now[MAXN],pos;
19 bool flag;
20
21 bool geta() {
22     for(int i = 2; i <= n; i++) {
23         int num = s[++pos];
24         if(b[1] > num && num != 0) num = num * 10 + s[++pos];
25         if(num % b[1] || num / b[1] >= 10) return false;
26         a[i] = num / b[1];
27         for(int j = 2; j <= m; j++) {
28             num = s[++pos];
29             if(a[i] > num && num != 0) num = num * 10 + s[++pos];
30             if(a[i] * b[j] != num) return false;
31         }
32     }
33     if(pos != len) return false;
34     return true;
35 }
36
37 bool getb() {
38     pos = 0;
39     for(int i = 1; i <= m; i++) {
40         int num = s[++pos];
41         if(a[1] > num && num != 0) num = num * 10 + s[++pos];
42         if(num % a[1] || num / a[1] >= 10) return false;
43         b[i] = num / a[1];
44     }
45     return true;
46 }
47
48 int main() {
49 #ifdef local
50     freopen("data.txt", "r", stdin);
51 //    freopen("data.txt", "w", stdout);
52 #endif
53     int t;
54     scanf("%d",&t);
55     while(t--) {
56         scanf("%d%d%s",&n,&m,s + 1);
57         len = strlen(s + 1);
58         for(int i = 1; i <= len; i++) s[i] = s[i] - ‘0‘;
59         flag = false;
60         for(int i = 1; i <= 9; i++) {
61             if(s[1] % i == 0) {
62                 a[1] = i;
63                 if(getb() && geta()) {
64                     flag = true;
65                     break;
66                 }
67             }
68         }
69         if(!flag) {
70             for(int i = 1; i <= 9; i++) {
71                 if((s[1] * 10 + s[2]) % i == 0) {
72                     a[1] = i;
73                     if(getb() && geta()) {
74                         flag = true;
75                         break;
76                     }
77                 }
78             }
79         }
80         if(flag) {
81             for(int i = 1; i <= n; i++) printf("%d",a[i]);
82             printf(" ");
83             for(int i = 1; i <= m; i++) printf("%d",b[i]);
84             printf("\n");
85         } else puts("Impossible");
86     }
87     return 0;
88 }

原文地址:https://www.cnblogs.com/scaulok/p/9940440.html

时间: 2024-07-30 02:20:04

ACM-ICPC 2018 青岛赛区现场赛 D. Magic Multiplication && ZOJ 4061 (思维+构造)的相关文章

2016 ACM/ICPC亚洲区青岛站现场赛(部分题解)

摘要 本文主要列举并求解了2016 ACM/ICPC亚洲区青岛站现场赛的部分真题,着重介绍了各个题目的解题思路,结合详细的AC代码,意在熟悉青岛赛区的出题策略,以备战2018青岛站现场赛. HDU 5984 Pocky 题意 给出一根棒子(可以吃的)的长度x和切割过程中不能小于的长度d,每次随机的选取一个位置切开,吃掉左边的一半,对右边的棒子同样操作,直至剩余的长度不大于d时停止.现在给出x和d,问切割次数的数学期望是多少. 解题思路 当看到第二个样例2 1时,结果是1.693147,联想到ln

ACM-ICPC 2018 青岛赛区现场赛 K. Airdrop &amp;&amp; ZOJ 4068 (暴力)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4068 题意:吃鸡游戏简化为二维平面上有 n 个人 (xi,yi),空投的位置在 (x0,y0),每一秒所有人向靠近空投的位置走一步,四个方向有优先级先后(优先纵坐标),若已经在空投的位置则不变.往空投位置移动过程中,若两个或者更多人在同一点相遇(在空投相遇不算),则他们都死亡.给出空投的纵坐标,询问空投在所有横坐标中最少和最多存活的人数是多少. 题解:在最优情况

2014ACM/ICPC亚洲区鞍山赛区现场赛——题目重现

2014ACM/ICPC亚洲区鞍山赛区现场赛--题目重现 题目链接 5小时内就搞了5题B.C.D.E,I. H题想到要打表搞了,可惜时间不够,后面打出表试了几下过了- - K题过的人也比较多,感觉是个几何旋转+ploya,但是几何实在不行没什么想法 B:这题就是一个大模拟,直接数组去模拟即可,注意细节就能过 C:类似大白上一题红蓝三角形的, 每个数字找一个互质和一个不互质个数,除掉重复就直接除2,然后总的C(n, 3)减去即可,问题在怎么处理一个数字互质和不互质的,其实只要处理出不互质的即可,这

ICPC 2018 徐州赛区网络赛

ACM-ICPC 2018 徐州赛区网络赛 ?去年博客记录过这场比赛经历:该死的水题 ?一年过去了,不被水题卡了,但难题也没多做几道.水平微微有点长进. ? ? D. Easy Math 题意: ? 给定 \(n\), \(m\) ,求 \(\sum _{i=1}^{m} \mu(in)\) .其中 $ 1 \le n \le 1e12$ , $ 1 \le m \le 2e9$ ,\(\mu(n)\) 为莫比乌斯函数. ? 思路: ? 容易知道,\(i\) 与 \(n\) 不互质时, \(\m

ACM总结——2017ACM-ICPC北京赛区现场赛总结

现在距离比赛结束已经过了一个多星期了,也是终于有时间写下心得了.回来就是被压着做项目,也是够够的. 这次比赛一样是我和两个学弟(虽然是学弟,但我的实力才是最弱的T_T)一起参加的,成绩的话打铁,算是情理之中意料之外了,我们本来以为自己会在北京赛区拿个倒数20什么的(比赛前听说北京赛区是最难的),事实上虽然不是很简单,但是也绝对没有想象中难(以为会A1或者零来着). 说下比赛前吧~赛前一星期是软考,所有自己训练很少,也正是这样,这场比赛算是抱了大腿(自己太菜了..)!咳咳~虽然软考复习了两周,但是

2014ACM/ICPC亚洲区鞍山赛区现场赛1009Osu!

鞍山的签到题,求两点之间的距离除以时间的最大值.直接暴力过的. A - Osu! Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 5078 Appoint description:  System Crawler  (2014-10-22) Description Osu! is a very popular music game. B

HDU 4119 Isabella&#39;s Message (2011年成都赛区现场赛I题)

1.题目描述:点击打开链接 2.解题思路:本题是一道模拟题,要求模拟一个解密的过程,练习这么久第一次做模拟题1Y了,内心还是很激动的~.只需要根据题意,记录* 所在的位置即可,然后每次都是先解密,后顺时针旋转90度.把每次解密的信息放到一个vector里,接下来就是连接它们,得到解密后的字符串,在map中查找这些单词是否存在即可.如果都存在,就把这条解密信息放到ans中,最后对ans排序,输出ans[0]就是答案. 3.代码: //#pragma comment(linker, "/STACK:

擦肩而过的那块牌--记ACM_ICPC西安赛区现场赛

说了那么多次orz,这次是真的orz了,去了西安打区域赛,也想过会打铁,但当最终那一刻确定打铁了之后,心里还是很不开心的,颁奖的时候思考熊那家伙嚣张的举起来手中那个金杯,说实话闪到我眼了(太亮了QAQ),打铁怨谁,这不好说,很多因素,别人别的我就不说了,但不能读英语实在让我不能忍,都说读不懂,带的那本字典几乎都没翻我会乱说?比完赛怨不该开f题,但当时3个半小时没人看i题,也怨我,一看到min就怯了,后来揭榜看到离铜牌区差8名,差12分钟..我呵呵了,第二题re一次罚时20分钟,可以说那次罚时也是

ACM-ICPC 2018 徐州赛区(网络赛)

A. Hard to prepare After Incident, a feast is usually held in Hakurei Shrine. This time Reimu asked Kokoro to deliver a Nogaku show during the feast. To enjoy the show, every audience has to wear a Nogaku mask, and seat around as a circle. There are