[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 ...
随机推荐
- Java常用数据结构Set, Map, List
1. Set Set相对于List.Map是最简单的一种集合.集合中的对象不按特定的方式排序,并且没有重复对象. 特点: 它不允许出现重复元素: 不保证和政集合中元素的顺序 允许包含值为null的元素 ...
- intellijidea 设置字体等
http://blog.csdn.net/asmcvc/article/details/17144951 1.下载安装AndroidStudio:http://developer.android.co ...
- lua实现简单
MessageManager.lua local messageManager = {mEventTable = {},mEventUserData = {}} --注册事件function mess ...
- SQL:REGEXP
作为一个更为复杂的示例,正则表达式B[an]*s匹配下述字符串中的任何一个:Bananas,Baaaaas,Bs,以及以B开始.以s结束.并在其中包含任意数目a或n字符的任何其他字符串. 以下是可用于 ...
- git 忽略提交及已push过得文件忽略提交
在使用Git的过程中,我们喜欢有的文件比如日志,临时文件,编译的中间文件等不要提交到代码仓库,这时就要设置相应的忽略规则,来忽略这些文件的提交 Git 忽略文件提交的方法 这种方式通过在项目的某个文件 ...
- 关于Ext4 extraParams 不能传递动态参数的问题解决办法
可以监听请求发送之前的事件:beforeload ,然后再添加请求的参数 me.store = Ext.create('Ext.data.JsonStore', { remoteSort: true, ...
- 转 zookeeper,dubbo和Nginx的区别
Nginx是著名的反向代理服务器,也被广泛的作为负载均衡服务器 ZooKeeper是分布式协调服务框架,有时也被用来做负载均衡 那么他们的区别是什么?如何选择呢? 下面从实际场景看下他们的关系 Ngi ...
- Codeforces 1190C Tokitsukaze and Duel game
题意:有一个长为n的01串,两个人轮流操作,每个人可以把某个长度为m的区间变成相同颜色,谁在操作后整个串颜色相同就赢了.问最后是谁赢?(有可能平局) 思路:容易发现,如果第一个人不能一击必胜,那么他就 ...
- Python第一章概述与环境安装
Python简介 Python是一种计算机程序设计语言.是一种动态的.面向对象的脚本语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的.大型项 ...
- 查看java进程内存简单示例
分析工具 1.jps 显示指定系统内的所有JVM进程 2.jstat 收集JVM各方面的运行数据 3.jinfo 显示JVM配置信息 4.jmap 堆快照 5.jhat 分析headdump文件 ...