P1134 階乘問題 n! 最右邊非0位的值
阿新 • • 發佈:2018-11-19
/** P1134 階乘問題 n! 最右邊非0位的值 連結:https://www.luogu.org/problemnew/show/P1134 常規演算法可通過O(n)解決的, 萬能的oeis粑粑...很高效的解決了這問題; 參考:http://oeis.org/A008904 t:n轉換為5進位制數後0的個數 x:segment (vec[i]*i) z:x+(t/2)%4 y:2^z ans:6*(y&1)+y*(1-(y&1))%10; 時間複雜度:log5(n) */ #include<bits/stdc++.h> #define ll long long using namespace std; vector<ll>vec; ll solve(ll n){ if(n==0||n==1) return 1; ll tmp=n,x=0,y,z,t; while(tmp) vec.push_back(tmp%5),tmp/=5; for(int i=0;i<vec.size();i++){ if(!(vec[i]&1)) t+=vec[i]; x+=vec[i]*i; } z=(x+(t>>1))%4,y=(1<<z); return (6*(y&1)+y*(1-(y&1)))%10; } int main(){ ll n;cin>>n; cout<<solve(n)<<endl; return 0; }