HDU - 5878 A - I Count Two Three H 技巧枚举
生活随笔
收集整理的這篇文章主要介紹了
HDU - 5878 A - I Count Two Three H 技巧枚举
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意
輸入 t (1≤t≤500000), the number of test cases. t test cases follow. Each test case provides one integer n (1≤n≤109).讓我們不小于n的最小的x滿足 x=2^a*3^b*5^c*7^d分析
這道題其實就是個枚舉 但是不能隨便枚舉 比如 如果向這樣枚舉的話 scanf("%lld",&n);for(ll i=n;;i++){ll tem = i;while(tem%2==0)tem/=2;while(tem%3==0)tem/=3;while(tem%5==0)tem/=5;while(tem%7==0)tem/=7;if(tem==1){printf("%lld\n",i);break;}}那鐵定是要TLE
case的數量是500000個 那平均輸入數據都比較大 每個數據要差不多搜索1000個數才能找到我們所想要找的數的話 就會發現 這里500000*1000 = 500000000 關鍵有些數據還不會僅僅的查找1000次就找到
所以這樣一定超時
我們看 既然枚舉數字比較麻煩
我們如果枚舉因子呢
我們已經知道 每個數的因子就是2,3,5,7
也就是說這個數一定能通過這四個數組合而成
如果我們通過枚舉這四個因子的數量去做呢
比如這樣
那可是快多了
也就是8萬多次循環就完成了
代碼如下:
#include<bits/stdc++.h> using namespace std; typedef long long ll; const ll maxn = 1e9+1; int main() {ll fac=1,ff,c=0;set<ll>s;ll ff2=1,ff3=1,ff5=1,ff7=1;for(int f2=0;ff2<maxn;f2++,c++){f2==0?ff2*=1:ff2*=2;for(int f3 = 0;ff2*ff3<maxn;f3++,c++){f3==0?ff3*=1:ff3*=3;for(int f5=0;ff2*ff3*ff5<maxn;f5++,c++){f5==0?ff5*=1:ff5*=5;for(int f7=0;ff2*ff3*ff5*ff7<maxn;c++,f7++){f7==0?ff7*=1:ff7*=7;fac = ff2*ff3*ff5*ff7;// cout<<fac<<endl;if(fac<maxn)s.insert(fac);else break;}ff7=1;}ff5=1;}ff3=1;}// cout<<c<<endl; 81510// cout<<s.size()<<endl; 7千多int t;scanf("%d",&t);while(t--){ll n;scanf("%lld",&n);printf("%lld\n",*(s.lower_bound(n)));}return 0; }總結
以上是生活随笔為你收集整理的HDU - 5878 A - I Count Two Three H 技巧枚举的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 常用函数 configpa
- 下一篇: Mac OS下安装MangoDB及其使用