#include & lt; vector & gt; # शामिल करें & lt; iostream & gt; # से & lt में शामिल हैं, stdio.h & gt; #define REP (i, n) के लिए (ll i = 1; i & lt; = n; i ++) नामस्थान std का उपयोग कर; Typedef अहस्ताक्षरित लंबे समय int ll; टाइपिंगफ वेक्टर & lt; वेक्टर & lt; ll & gt; & Gt; मैट्रिक्स; एलओडी = 1000000007; कॉन्स्ट लो K = 2; // ए * बी मैट्रिक्स mul (मैट्रिक्स ए, मैट्रिक्स बी) {मैट्रिक्स सी (के + 1, वेक्टर & lt; ll & gt; (के + 1)) गणना करता है; आरपी (आई, के) आरईपी (जे, के) आरपी (के, के) सी [आई] [जे] = (सी [आई] [जे] + ए [आई] [के] * बी [के] [जे] )% एमओडी; वापसी सी; } // एक ^ पी मैट्रिक्स पाउ (मैट्रिक्स ए, एल पी) {if (पी == 1) वापसी ए; अगर (पी एंड 1) रिटर्न मुल (ए, पॉव (ए, पी -1)); मैट्रिक्स एक्स = पाउ (ए, पी & gt; & gt; 1); वापसी मुल (एक्स, एक्स); } // फिबोनैचि अनुक्रम के एन-वें पद को रिटर्न देता है I ll फिब (एल एन) {// सदिश एफ 1 वेक्टर & lt; ll & gt; एफ 1 (K + 1); एफ 1 [1] = 1; एफ 1 [2] = 3; // बनाने मैट्रिक्स टी मैट्रिक्स टी (के + 1, वेक्टर & lt; ll & gt; (के + 1)); टी [1] [1] = 0, टी [1] [2] = 1; टी [2] [1] = 2, टी [2] [2] = 2; // raise (N-1) वें शक्ति को बढ़ाएं यदि (एन == 1) रिटर्न 1; टी = पा (टी, एन -1); // उत्तर टी की पहली पंक्ति है एफ 1 लो res = 0; आरईपी (आई, के) रिज = (आरएस + ((टी [1] [आई]) * (एफ 1 [आई])))% एमओडी; रिटर्न रिज़; } Ll fib2 (ll n) {if (n == 1) रिटर्न 1; Ll एक = 1; ll बी = 3; ll सी; के लिए (ll i = 3; i & lt; = n; i ++) {c = (2 * ए + 2 * बी)% MOD; a = b; B = C; } वापसी सी; } Int main () {ll t; scanf ( "% LLU", & amp; टी); // t = 10000; Ll n = 1; जबकि (टी--) {scanf ("% llu", & amp; n); // n = 1; // n ++; // n = 1000000000; printf ( "% LLU \ n", मिथ्या (एन)); } वापसी 0; } मैं 1,3,8,22,60,164 ए [एन] = 2 * (एक [एन -1] + एक [एन -2] उत्पन्न करने के लिए एक कोड लिख रहा हूं मॉड 10 ^ 9 + 7। मैं इस अनुक्रम को उत्पन्न करने के लिए मॉड्यूलर एक्सपोनेन्टियेशन और मैट्रिक्स गुणा पद्धति का उपयोग कर रहा हूं। मैं सबसे खराब स्थिति के लिए 2.3 सेकंड से अपना समय कैसे सुधार सकता हूँ, अर्थात n = 10 ^ 9 10000 गुना .5 से 1 सेकेंड तक? कृपया मुझे इस कोड की गति में सुधार करने के लिए सुझाव दें।
मुझे संदेह है vector मुख्य अपराधी है - गतिशील आवंटन और संख्यात्मक सामान बहुत अच्छी तरह से मिश्रण नहीं करते।
2x2 मैट्रिक्स किसी फैंसी एल्गोरिथम के लिए किसी भी प्रभाव का रास्ता बहुत छोटा है क्या आपने छोरों को नियंत्रित करने और गतिशील आवंटन की खुदाई करने की कोशिश की है?
I आशा यह सही है: शून्य mul (ll ए [] [2], ll बी [] [2], ll सी [] [2]) { सी [0] [0] = (ए [0] [0] * बी [0] [0])% एमओडी; सी [0] [0] = (सी [0] [0] + ए [0] [1] * बी [1] [0])% एमओडी; सी [0] [1] = (ए [0] [0] * बी [0] [1])% एमओडी; सी [0] [1] = (सी [0] [1] + ए [0] [1] * बी [1] [1])% एमओडी; सी [1] [0] = (ए [1] [0] * बी [0] [0])% एमओडी; सी [1] [0] = (सी [1] [0] + ए [1] [1] * बी [1] [0])% एमओडी; सी [1] [1] = (ए [1] [0] * बी [0] [1])% एमओडी; सी [1] [1] = (सी [1] [1] + ए [1] [1] * बी [1] [1])% एमओडी; } शून्य पा (ll ए [] [2], ll पी, ll out [] [2]) {if (पी == 1) {बाहर [0] [0] = ए [0] [0]; बाहर [0] [1] = ए [0] [1]; बाहर [1] [0] = ए [1] [0]; बाहर [1] [1] = ए [1] [1]; वापसी; } If (p & 1) {ll बी [2] [2] = {{0}}; पाउ (ए, पी -1, बी); मूल (ए, बी, आउट); } और {एल एक्स [2] [2] = {{0}}; पाउ (ए, पी & gt; 1, एक्स); Mul (एक्स, एक्स, बाहर); }} Ll fibv (ll एन) {ll टी [2] [2] = {{2, 2}, {1,}}; अगर (एन == 1) रिटर्न 1; Ll आरएम [2] [2] = {{0}}; पाउ (टी, एन -1, आरएम); Ll res = आरएम [0] [1]% एमओडी; Res = (res + आरएम [0] [0] * 3)% एमओडी; रिटर्न रिज़; }
Comments
Post a Comment