这道搞死人的题目叫做:
好简单的题啊
Time Limit: 2000 ms
Memory Limit: 65536 KB
Input
(一)最简单朴素的想法:
按照左边的等式依次算下去再比较两边!好吧,这个想法确实很简单~你被标题附身了!问题是数据在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