算法学习笔记(1):组合数
暴力题解 --时间复杂度O(nlogn)。
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long longsigned main(){int n;cin>>n;int ans=0;for(int i=2;i<=n;i+=2){int x=i;while(x%2==0){ans++;x/=2;}}cout<<ans;
}
正解算法--Legendre 公式(勒让德公式 )
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long longsigned main(){int n;cin>>n;int ans=0;while(n){ans+=n/2;n/=2;}//即让n/2/4/8/16cout<<ans;
}
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long longsigned main(){//同理可知,算n!内有几个10相乘,即多少个2和多少个5能相乘int n;cin>>n;int ans=0;int a2=0,a5=0;int x;x=n;while(x){a2+=x/2;x/=2;}x=n;while(x){a5+=x/5;x/=5;}ans+=min(a2,a5);cout<<ans;
}