记一道搞死人的longlong乘积截64位

这道搞死人的题目叫做:


好简单的题啊

Time Limit: 2000 ms

Memory Limit: 65536 KB

Description

tsfn是应该数学迷,有一天他遇到一个很奇怪的式子 1,好奇的tsfn想知道该式子的结果是否等于 2,是不是很简单啊^_^。

Input

第一行包括一个整数T(1<=T<=100),表示有T组数据,每组数据的第一行是两个整数p,q(1 ≤ q ≤ p ≤ 10^18),第二行是一个整数n(1 ≤ n ≤ 90),第三行是n个整数 a1, a2, ..., an(1 ≤ ai ≤ 10^18 )。

Output

如果相等,输出"YES",否则输出"NO"。

Sample Input

3
9 4
2
2 4
9 4
3
2 3 1
9 4
3
1 2 4

Sample Output

YES
YES
NO


(一)最简单朴素的想法:

按照左边的等式依次算下去再比较两边!好吧,这个想法确实很简单~你被标题附身了!问题是数据在10^18,一取倒数就没货啦,最后两边等不起来。

(二)移项:

如果右边数据很大,把左边的移过去就行了!记m=p/q,那么第一次移项得到右边为m = 1/(m-a1),第二次m = 1/(m-a2),……依次操作得到an,和m比较。奇迹的是又WA啦!想想也是,每次都直接除,精度肯定满满减少然后误差极大,极有可能明明不等于这个分数的,但是因为小数很相近就奇迹般YES了。

(三)保留分式

每次移项为了保证精度不丧失,直接赋值新的p,q,那就不怕啦~temp = q; q = p-a1*q; p = temp; 这次肯定没错了吧!!提交了代码以后又WA……

(四)截64位的真相

跑去找出题人要数据,结果一头栽在了这组:

990130967049151695 166430169817556175
1
564668656008429569

这组数据就是分别表示p,q,n,a,然后p = a*q, 打出“YES”, 问题是用肉眼看看就知道p/q应该是一位数啊!计算机傻了~~因为它算a*q的时候只截取了后64位二进制,刚好等于p,它就愚蠢地认为两者相等……囧……所以前面要加个特判 p/q > a 那么就不会溜了这种情况……


下面附送测试数据与答案:(一般41-43组数据容易错,仔细对哦)

input:

49
9 4
2
2 4
9 4
3
2 3 1
9 4
3
1 2 4
39088169 24157817
36
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2
39088169 24157817
36
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4
61305790721611591 37889062373143906
80
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4
61305790721611591 37889062373143906
80
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2
565049485241691020 228217260073568804
40
2 2 9 1 7 1 2 1 2 1 1 1 9 1 2 1 9 1 3 2 3 10 13 2 1 2 7 1 1 2 2 2 1 1 2 1 6 5 3 2
2 1
4
2 1 1 1
4 1
2
3 1
72723460248141 1597
1
45537545554
14930352 13
6
1148488 1 1 1 1 2
86267571272 102334155
6
842 1 841 1 842 145
72723460248141 121393
7
599074578 122 1 122 2 1 2
168455988218483660 53310571951833359
32
3 6 3 1 14 1 48 1 3 2 1 1 39 2 1 3 13 23 4 1 11 1 1 23 1 3 3 2 1 1 1 3
382460255113156464 275525972692563593
37
1 2 1 1 2 1 3 4 5 5 1 4 2 1 1 1 4 2 2 1 2 1 1 2 3 3 1 2 2 50 4 1 4 2 5 109 8
1000000000000000000 1
1
1000000000000000000
362912509915545727 266073193475139553
30
1 2 1 2 1 25 75 1 14 6 6 9 1 1 1 1 210 2 2 2 5 2 1 3 1 1 13 3 14 3
933329105990871495 607249523603826772
33
1 1 1 6 3 1 5 24 3 55 1 15 2 2 1 12 2 2 3 109 1 1 4 1 4 1 7 2 4 1 3 3 2
790637895857383456 679586240913926415
40
1 6 8 2 1 2 1 7 2 4 1 1 1 10 1 10 1 4 1 4 41 1 1 7 1 1 2 1 2 4 1 2 1 63 1 2 1 1 4 3
525403371166594848 423455864168639615
38
1 4 6 1 1 32 3 1 14 1 3 1 2 4 5 4 1 2 1 5 8 1 3 1 2 1 46 1 1 1 3 1 4 1 11 1 2 4
1 1
1
1
2 1
2
1 2
531983955813463755 371380136962341468
38
1 2 3 4 1 37 1 12 1 3 2 1 6 3 1 7 3 2 8 1 2 1 1 7 1 1 1 7 1 47 2 1 3 1 1 5 1 2
32951280099 987
7
33385288 1 5 1 5 1 6
6557470319842 86267571272
6
76 76 76 76 76 76
934648630114363087 6565775686518446
31
142 2 1 5 2 2 1 1 3 1 2 8 1 3 12 2 1 23 5 1 10 1 863 1 1 1 2 1 14 2 3
61305790721611591 37889062373143906
81
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
4 1
1
4
500000000000000001 5
2
100000000000000000 5
1000000000000000000 3
3
3 4 5
822981258385599125 28316248989464296
39
29 15 1 1 1 4 4 4 1 3 1 5 12 1 1 1 1 1 6 5 2 1 11 1 1 26 1 2 2 2 14 1 1 1 3 2 4 1 1
823443107025550834 331822464812968648
42
2 2 13 14 4 4 1 1 1 1 2 1 1 1 1 113 1 1 8 1 1 1 1 2 2 1 15 1 5 1 1 2 1 1 1 14 4 3 1 5 1 1
226137305050296073 27076290603746056
30
8 2 1 5 3 67 2 1 6 1 2 1 5 1 11 8 43 2 1 7 1 95 2 3 1 11 5 2 1 1
524928871965838747 313083111434773473
35
1 1 2 10 1 4 12 3 28 1 23 1 1 1 4 1 4 3 1 3 2 3 1 4 3 1 3 2 3 11 21 1 35 1 1
633468529243155234 4
90
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
742143496299253703 2
90
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
550736960584023286 3
90
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
2 1
10
99999999999999999 99999999999999999 99999999999999999 99999999999999999 99999999999999999 99999999999999999 99999999999999999 99999999999999999 99999999999999999 99999999999999999
262882295792523313 105000000000078855
1
105000000000078855
990130967049151695 166430169817556175
1
564668656008429569
9 4
2
2 3
529824479480396864 4705882352941177
2
80000000000000007 80000000000000009
985625905209512860 565433601688714177
10
6423 24947 27507 13031 16414 29169 901 32592 18763 1656
913255926290448385 4400000000
2
4400000000 4400000000
7 2
2
2 1
10 3
1
3
4 2
1
2
1337 42
1
31

output:

YES
YES
NO
YES
NO
NO
YES
YES
NO
YES
NO
YES
NO
YES
NO
YES
YES
NO
YES
NO
YES
YES
NO
YES
YES
YES
YES
YES
YES
YES
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
YES
NO

有问题可以发我邮箱 wulidan0530@live.com

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值