题目传送门(内部题36)


输入格式

第一行一个整数$T$,表示数据组数。
接下来$T$行,每行两个空格隔开的整数$n,m$。


输出格式

对于每组数据,输出一行$"Yes"$或$"No"$(不包括引号),表示对于这组数据,扔西瓜无穷多次后,能否保证每个玩具小人都扔过西瓜。


样例

样例输入:

10
16 2
45 76
674091 234962
28687659 81999918
216966660425134880 694698856141666063
7917958698896159119471256123588118261064432286766395711821720896686225354014397 3
746849 229640484701817039414316292795728961279644416746723977234945018225880862408045
948324971099475 6357310881479510637970061186310751903627811585469901935558116653181536335266604
513581062809439938725941485703231626402353296549797226542655513017359376988934 56049011113707442491563165140739607603866754001957435234277149221957579519773
1405005705796027467337069061 140500570577788434

样例输出:

No
Yes
Yes
No
Yes
Yes
Yes
No
Yes
No


数据范围与提示

第$1$个测试点,$n\leqslant 100,m\leqslant 100$。
第$2$个测试点,$n\leqslant {10}^6,m\leqslant {10}^6$。
第$3$个测试点,$n\leqslant {10}^{18},m\leqslant {10}^{18}$。
第$4$个测试点,$m\leqslant 3$。
第$5$个测试点,$m\leqslant 10$。
第$6$个测试点,$m\leqslant {10}^6$。
第$7$个测试点,$n\leqslant {10}^6$。
第$8$个测试点,$n\leqslant {10}^{15}$。
第$9,10$个测试点,无特殊限制。
对所有测试点,$T=10$。$n$和$m$为长度不超过$100$的十进制正整数。


题解

显然如果$gcd(n,m)=1$的话输出$Yes$,否则输出$No$。

但是数据范围也显然要求我们打高精度。

在此介绍一种求$GCD$的方法。

$\alpha .n\%2=0$且$m\%2=0$时,$gcd(n,m)=2*gcd(\frac{n}{2},\frac{m}{2})$
$\beta .n\%2=0$且$m\%2!=0$时,$gcd(n,m)=gcd(\frac{n}{2},m)$
$\gamma .n\%2!=0$且$m\%2=0$时,$gcd(n,m)=gcd(n,\frac{m}{2})$
$\delta .n\%2!=0$且$m\%2!=0$时,$gcd(n,m)=gcd(n,abs(n-m))$

用这种方法可以降低代码复杂度。

而且注意$\alpha$情况直接输出$Yes$即可。

时间复杂度:$\Theta(\log \max(n,m))$

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
char ch[110];
int A[110],B[110];
int flag[110];
void chuA()
{
int jw=0;
for(int i=A[0];i;i--)
{
jw*=10;
jw+=A[i];
flag[i]=jw/2;
jw%=2;
}
int len=0;
int top=A[0];
memset(A,0,sizeof(A));
for(int i=top;i;i--)
{
if(flag[i])len=max(len,i);
A[i]=flag[i];
}
A[0]=len;
}
void chuB()
{
int jw=0;
for(int i=B[0];i;i--)
{
jw*=10;
jw+=B[i];
flag[i]=jw/2;
jw%=2;
}
int len=0;
int top=B[0];
memset(B,0,sizeof(B));
for(int i=top;i;i--)
{
if(flag[i])len=max(len,i);
B[i]=flag[i];
}
B[0]=len;
}
void change()
{
if(A[0]==B[0])
{
for(int i=A[0];i;i--)
{
if(A[i]<B[i]){swap(A,B);return;}
if(A[i]>B[i])return;
}
return;
}
if(A[0]<B[0])swap(A,B);
return;
}
void jian()
{
int jw=0;
for(int i=1;i<=A[0];i++)
if(A[i]-jw-B[i]<0)
{
flag[i]=A[i]-jw+10-B[i];
jw=1;
}
else
{
flag[i]=A[i]-jw-B[i];
jw=0;
}
if(jw)flag[A[0]]=0;
int len=0;
int top=A[0];
memset(A,0,sizeof(A));
for(int i=top;i;i--)
{
if(flag[i])len=max(len,i);
A[i]=flag[i];
}
A[0]=len;
}
int gcd()
{
change();
if((B[0]==1&&B[1]==1)||(A[0]==1&&A[1]==1))return 1;
if(!B[0]){if(A[0]==1&&A[1]==1)return 1;return 0;}
if(!(A[1]&1)&&!(B[1]&1))return 0;
if(!(A[1]&1)&&(B[1]&1)){chuA();return gcd();}
if((A[1]&1)&&!(B[1]&1)){chuB();return gcd();}
if((A[1]&1)&&(B[1]&1)){jian();return gcd();}
}
int main()
{
int T;scanf("%d",&T);
while(T--)
{
scanf("%s",ch+1);
A[0]=strlen(ch+1);
for(int i=1;i<=A[0];i++)
A[i]=ch[i]-'0';
reverse(A+1,A+A[0]+1);
scanf("%s",ch+1);
B[0]=strlen(ch+1);
for(int i=1;i<=B[0];i++)
B[i]=ch[i]-'0';
reverse(B+1,B+B[0]+1);
if(!A[1]&&A[0]==1){puts("Yes");continue;}
change();
if(gcd())puts("Yes");
else puts("No");
}
return 0;
}

rp++

[CSP-S模拟测试]:金(king)(高精度+模拟)的更多相关文章

  1. [CSP-S模拟测试]:表达式密码(模拟)

    题目传送门(内部题87) 输入格式 从文件$expression.in$中读入数据.输入一行,一个字符串$S$,表示原表达式,保证为合法表达式 输出格式 输出到文件$expression.out$中. ...

  2. [CSP-S模拟测试]:天空龙(模拟)

    题目描述 奥西里斯之天空龙很喜欢颜色,有一天他找到了三种颜色——红黄蓝.奥西里斯有$a$个红色,$b$个黄色,$c$个蓝色,他想用画出最好的画,可是需要至少$x$个红色,$y$个黄色和$z$个蓝色,似 ...

  3. [CSP-S模拟测试]:折纸(模拟)

    题目描述 小$s$很喜欢折纸.有一天,他得到了一条很长的纸带,他把它从左向右均匀划分为$N$个单位长度,并且在每份的边界处分别标上数字$0\sim n$.然后小$s$开始无聊的折纸,每次他都会选择一个 ...

  4. [CSP-S模拟测试]:引子(大模拟)

    题目描述 网上冲浪时,$Slavko$被冲到了水箱里,水箱由上而下竖直平面.示意图如下: 数字$i$所在的矩形代表一个编号为$i$的水箱.1号水箱为水箱中枢,有水管连出.除了$1$号水箱外,其他水箱上 ...

  5. [CSP-S模拟测试]:Median(暴力+模拟)

    题目描述 定义两个数列: $$S=\{S(1),S(2),...,S(n)\}\text{和}S_2\{S_2(1),S_2(2),...,S_2(n)\}$$ $$S(k)=(p_k\times k ...

  6. [CSP-S模拟测试]:走格子(模拟+BFS+Dijkstra)

    题目描述 $CYJ$想找到他的小伙伴$FPJ$,$CYJ$和$FPJ$现在位于一个房间里,这个房间的布置可以看成一个$N$行$M$列的矩阵,矩阵内的每一个元素会是下列情况中的一种:$1.$障碍区域—这 ...

  7. csp-s模拟测试99

    csp-s模拟测试99 九九归一直接爆炸. $T1$一眼板子. $T2$一眼语文题(语文的唯一一次$120+$是给模拟出来的可知我的语文能力). $T3$一眼普及题. ?? Hours Later 板 ...

  8. 「题解」NOIP模拟测试题解乱写II(36)

    毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...

  9. Android单元测试与模拟测试详解

    测试与基本规范 为什么需要测试? 为了稳定性,能够明确的了解是否正确的完成开发. 更加易于维护,能够在修改代码后保证功能不被破坏. 集成一些工具,规范开发规范,使得代码更加稳定( 如通过 phabri ...

随机推荐

  1. 【HDOJ6599】I Love Palindrome String(PAM,manacher)

    题意:给出一个由小写字母组成的长为n的字符串S,定义他的子串[L,R]为周驿东串当且仅当[L,R]为回文串且[L,(L+R)/2]为回文串 求i=[1,n] 所有长度为i的周驿东串的个数 n<= ...

  2. NOIP day1 玩具谜题

    逻辑有一些复杂,但是理解之后就很简单.题目描述中mogician什么的太暴力了...-1s 按照题目描述模拟,就能满分. /* Au: GG * CCF NOIP2016 day1 * toy */ ...

  3. 家用NAS配置方案

    对家用用户而言,NAS即一台下载机,硬件需要满足以下几点: 1.稳定性:24×7稳定无故障运行. 2.拓展性:较多的硬盘槽位,便于容量扩容: 3.体积小巧:占地面积小,便于放置. 4.方便远程管理:无 ...

  4. [题解]Magic Line-计算几何(2019牛客多校第三场H题)

    题目链接:https://ac.nowcoder.com/acm/contest/883/H 题意: 给你偶数个点的坐标,找出一条直线将这n个点分成数量相等的两部分 并在这条直线上取不同的两个点,表示 ...

  5. VS2012修改代码时会把后面的覆盖

    vs2012修改代码时会把后面的覆盖,并且鼠标指针变成灰色竖方块 解决:按一下键盘上的Insert键

  6. python网络爬虫实战之快速入门

    本系列从零开始阐述如何编写Python网络爬虫,以及网络爬虫中容易遇到的问题,比如具有反爬,加密的网站,还有爬虫拿不到数据,以及登录验证等问题,会伴随大量网站的爬虫实战来进行. 我们编写网络爬虫最主要 ...

  7. Spring Boot 2.x引入JS,CSS 失效问题

    我的SpringBoot版本是2.0,启动后发现页面奇丑无比: 看下目录结构: SpringBoot默认扫描Static文件夹下的文件,这里把CSS,JS以及图片文件都放在了asserts文件夹下. ...

  8. leetcode.图.207课程表-Java

    1. 具体题目 现在你总共有 n 门课需要选,记为 0 到 n-1.在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1].给定 ...

  9. django创建web页面

    https://blog.csdn.net/ImagineCode/article/details/54586326 https://blog.csdn.net/qq_29186489/article ...

  10. Python开发简介

    年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承 . 最新的TIOBE排行榜,Python已经占据世界第四名的位置, Python崇尚优美 ...