看板 C_and_CPP 關於我們 聯絡資訊
題目 http://zerojudge.tw/ShowProblem?problemid=d419 遇到的問題: 嘗試先建質數表 再建每個數質因數數量的表 但是建到一百萬好像就已經TLE了@@ 有問題的code: (請善用置底文的標色功能) code如下 上半部建質數表再丟到store陣列裡面去 中半部先算出每個數的質因數數目 下半部才是接受輸入的數目並把所有2~n的質因數數目加起來 請問哪裡可以改進效率避免TLE呢@@ #include<iostream> using namespace std; bool prime[1000000]={1,1,0,0}; int store[78500]={0}; int storeans[1000000]={0}; int a,b,c,d,i,h,g,n,k,l,j; int main() { for(a=4;a<1000000;a+=2) prime[a]=1; for(a=6;a<1000000;a+=3) prime[a]=1; d=0; for(a=5;a<1000000;a=a+d%2*2+2,d++) { if(prime[a]==0) { b=a; while(b+a<1000000) { b+=a; prime[b]=1; } } else continue; } c=0; for(a=0;a<1000000;a++) { if(prime[a]==0) { store[c]=a; c++; } } for(a=2;a<=1000000;a++) { l=0; for(j=0;j<1000;j++) { if(a%store[j]==0) { storeans[a]=storeans[a/(store[j])]+1; l=1; break; } } if(l) continue; h=0; k=a; c=0; while(k!=1) { while(k%store[c]==0) { k/=store[c]; h++; } //end inner while c++; } //end second while storeans[a]=h; } while(cin>>n) { g=0; for(a=2;a<=n;a++) { g+=storeans[a]; } cout<<g<<endl; } //end outer while return 0; } 補充說明: -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.228.97.60
netsphere:這可以用DP加速 10/31 22:05
bleed1979:6n+-1配合篩法建質數表 10/31 22:15
tw00088437:a=a+d%2*2+2,d++ <---我有用6n+-1啊@@" 10/31 22:18
tw00088437:請問1樓 DP是?? 10/31 22:19
bleed1979:a[2]=1 a[2*2]=1+1 a[2*2*2]=a[2*2]+1 10/31 22:20
tw00088437:storeans[a]=storeans[a/(store[j])]+1 <--請問樓上是 10/31 22:21
tw00088437:指這個嗎@@? 10/31 22:21
janice001:動態規劃 10/31 22:57
tw00088437:@@? 10/31 23:22
joefaq:http://nopaste.csie.org/4b810 參考一下 10/31 23:36
tw00088437:噢噢大致看懂了 感謝: ))) 11/01 00:33
tw00088437:不過inline 還有int main()裡面的東西不太了解 11/01 00:33
tw00088437:還沒學到 可以稍微解釋一下嗎^^" 11/01 00:33
cplusplus:先自己上網或看書會不會比較有誠意一點...? 11/01 01:53
bleed1979:其實方法大致和推文的程式碼一樣,只是應該不需用到% 11/01 10:19
bleed1979:以下程式碼速度大概快一倍 11/01 10:19
bleed1979:http://codepad.org/KDXwRtCf 11/01 10:20
tw00088437:看懂了 謝謝^^" 11/01 11:46