SGU 154 解题手记
这题与已经离我们而去的TJU上的一个题很像,那是要求N!末尾有多少个0,答案就是
。如果把N!拆成质因数相乘,只有2*5才会出现0,而2的个数远多于5,所以只要统计N以下的数中质因数5的总数就可以了。
而这个题目,就变成了解
。
解法1:二分枚举N。N不会超过5*10^8,虽然比较大,但仍然可以接受。另外,N肯定是5的倍数,这就不用解释了。
解法2:已知
末尾有
个0,
末尾有
个0,证明
的末尾有
个0。
,得证。
设
,且不存在
,将N写成
的形式,则N!末尾0的个数为
。
可以逐个将k解出。之所以要求不能有5个一样的k,是因为如果有5个一样的k,就不能套用上面的那个等式了(去掉[]再加上[]的时候会出现不等)。如果某个Q导致出现了5个一样的k,那就是无解的。
Submit 1: WA on 3。不知道怎么错的,看不出来。晕……题目认为当Q=0时N=1而不是N=0。
Submit 2: WA on 1。特殊判断写错地方了……
Submit 3: AC。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | //AC #include <iostream> using namespace std; const long power5[13]={1,5,25,125,625,3125,15625,78125,390625,1953125,9765625,48828125,244140625}; int main() { long n(0),q,c(1),k(12); bool same; cin>>q; if (q==0) { cout<<1; return 0; } while (q) { same=true; for (;(power5[k]-1)/4>q;--k,same=false); if (same) ++c; else c=1; if (c>4) break; n+=power5[k]; q-=(power5[k]-1)/4; } if (c>4) cout<<"No solution"; else cout<<n; return 0; } |
