B
一开始以为是数位dp,没看数据范围明显不是任何dp能解决的,所以其实应该是道纯粹的数学题。在这里真的必须要佩服zyy的直觉了,他在我们陷入僵局以后提出了质因数的方法,只是可惜大家在数学没有想到2比5多这个结论,痛失了卧槽,前两题其实出得挺快的
#include<bits/stdc++.h>
#define ll long long
using namespace std;void solve(){ll n;cin>>n;ll ans=0;while(n){n/=5;ans+=n;}cout<<ans<<endl;
}int main(){int T;cin>>T;while(T--){solve();}return 0;
}
然后我有点没搞懂的就是数学原理,为什么$⌊n/p⌋$能表示n中质因子p的个数,其实是因为
$p$的倍数可以表示为$p,2p,3p,4p,kp$,其中$kp \le n$,因此$k \le n/p$因此,个数即是$⌊n/p⌋$
E
稍稍有点不同的博弈论,首先令$SG(n)=true$为先手必胜,那么不同的点在于当$i \le max(a,b,c)$时,$SG(n)=true$。在考场上我想的是从已知状态往后推未知状态,然而这就有一个问题就是同一个状态会被不同的前驱状态到达。所以其实正确的思路应该是从后往前推。
状态转移方程就应该是这样的:$sg[i]=((!sg[i-a])||(!sg[i-b])||(!sg[i-c]))$ 写在程序中只需要特判$i \le max(a,b,c)$ 这可能是博弈论的递推做法。
状态转移方程给出了就不给代码了。
