题解 | 排列与二进制
#include <bits/stdc++.h> using namespace std; int main(){ int n,m; while(cin>>n>>m){ if(n==0)break; int k,ans=0; for(int i=n;i>=n-m+1;i--){ k=i; while(k%2==0){ ans++; k/=2; } } cout<<ans<<endl; } }
直接算是算不出来的,因为数据里面会有很大的数,那么既然是求模,我们可以利用快速幂中的数学原理把更多的模放在前面的乘法运算中去,可以知道,如果想要得到全部的尾0,可以直接运算出来结果,然后不断进行多次模运算,那么,我们把这些模分配到实际运算中,可以发现,假如一个数模2没有0,那么这些数的乘积也是无模2的,如果有0,他们0的个数的和就是结论,所以有上述代码