[CSP-S模拟测试]:金(king)(高精度+模拟)
题目传送门(内部题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)(高精度+模拟)的更多相关文章
- [CSP-S模拟测试]:表达式密码(模拟)
题目传送门(内部题87) 输入格式 从文件$expression.in$中读入数据.输入一行,一个字符串$S$,表示原表达式,保证为合法表达式 输出格式 输出到文件$expression.out$中. ...
- [CSP-S模拟测试]:天空龙(模拟)
题目描述 奥西里斯之天空龙很喜欢颜色,有一天他找到了三种颜色——红黄蓝.奥西里斯有$a$个红色,$b$个黄色,$c$个蓝色,他想用画出最好的画,可是需要至少$x$个红色,$y$个黄色和$z$个蓝色,似 ...
- [CSP-S模拟测试]:折纸(模拟)
题目描述 小$s$很喜欢折纸.有一天,他得到了一条很长的纸带,他把它从左向右均匀划分为$N$个单位长度,并且在每份的边界处分别标上数字$0\sim n$.然后小$s$开始无聊的折纸,每次他都会选择一个 ...
- [CSP-S模拟测试]:引子(大模拟)
题目描述 网上冲浪时,$Slavko$被冲到了水箱里,水箱由上而下竖直平面.示意图如下: 数字$i$所在的矩形代表一个编号为$i$的水箱.1号水箱为水箱中枢,有水管连出.除了$1$号水箱外,其他水箱上 ...
- [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 ...
- [CSP-S模拟测试]:走格子(模拟+BFS+Dijkstra)
题目描述 $CYJ$想找到他的小伙伴$FPJ$,$CYJ$和$FPJ$现在位于一个房间里,这个房间的布置可以看成一个$N$行$M$列的矩阵,矩阵内的每一个元素会是下列情况中的一种:$1.$障碍区域—这 ...
- csp-s模拟测试99
csp-s模拟测试99 九九归一直接爆炸. $T1$一眼板子. $T2$一眼语文题(语文的唯一一次$120+$是给模拟出来的可知我的语文能力). $T3$一眼普及题. ?? Hours Later 板 ...
- 「题解」NOIP模拟测试题解乱写II(36)
毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...
- Android单元测试与模拟测试详解
测试与基本规范 为什么需要测试? 为了稳定性,能够明确的了解是否正确的完成开发. 更加易于维护,能够在修改代码后保证功能不被破坏. 集成一些工具,规范开发规范,使得代码更加稳定( 如通过 phabri ...
随机推荐
- APIO2019 练习赛 Wedding cake——思路+高精度
题目大意: 给 n ( n<=1e5 ) 个数 \( a_i \) (\( a_i \) <=1e5),需要构造 n 个实数使得它们的和是 1 ,并且第 i 个实数必须小数点后恰好有 \( ...
- mysql捕捉所有SQL语句
MySQL可以通过开通general_log参数(可动态修改)来扑捉所有在数据库执行的SQL语句.显示参数:mysql> show variables like 'general%log%';+ ...
- 在RedHat中安装新字体
安装 下载这个字体. http://pan.baidu.com/s/1c23znaS 密码:tldo 在/usr/share/fonts/truetype/, 下建立一个新的目录 YaHei Cons ...
- Visual Studio Code - 调试 Node.js 代码
官方的文档写的太好了!大家还是看参考资料吧. 参考资料: Debugging in Visual Studio Code Debug Node.js Apps using Visual Studio ...
- Red Gate .NET Reflector
Debug and decompile inside Visual Studio (VSPro edition) Use the Visual Studio debugger Use your reg ...
- 重温《javascript高级程序设计》(第3版)
1.重温<JavaScript高级程序设计>(第3版) (一)重温<javascript高级程序设计>(第1-4章) (二)重温<JavaScript高级程序设计> ...
- 4.jmeter在线并发的怎样设置
4.1Jmeter 快速入门教程(一) - 认识jmeter和google插件 4.2Jmeter 快速入门教程(二)--创建简单web测试 打印 E-mail 4.3Jmeter 快速入门教程(三- ...
- easyUI学习笔记一
1.引用js文件 <script type="text/javascript" src = jquery-easyui/jquery.min.js> </scri ...
- C#解惑:HashSet<T>类
原贴: https://blog.csdn.net/X_X_OO/article/details/52529548 https://www.cnblogs.com/refuge/p/9465466.h ...
- YUV/RGB与H264之间的编解码
1.源码下载 http://download.videolan.org/x264/snapshots/ 2.编译 ./configure --prefix=./_install --enable-sh ...