ACM數論一些簡單結論和程式設計小技巧總結
阿新 • • 發佈:2019-01-03
前言
- 最近被數論的模運算卡了一發。。稍微總結一下最近用到的數論結論
- 另外,get了一些實現的技巧,也一起記一下~免得忘了~
數論簡單結論
- n = p(1) ^ num(1) * p(2) ^ num(2) … * p(m) ^ num(m),根據乘法原理,n的因子數有(num(1) + 1) * … *(num(m) + 1)
- 根據費馬小定理推得:a^x % p = a^(x%(p-1) ) % p
程式設計小技巧
auto型別使用
- c++11的特性,必須初始化,以自動得到型別
- 定義時使用(多用於複雜的迭代器定義)
//例如 auto it 取代 map<int,int> iterator it
map<int,int> mapp;
auto it = mapp.begin();
- for 迴圈中使用,注意這時auto的型別不再是迭代器,而是容器中的真實型別
//例一,遍歷string的每一個字元,這時ch是char型別
string str;
for (auto ch : str)
;
//例二,遍歷vector,這時str是string型別
vector<string> vec;
for (auto str : vec)
;
//例三,遍歷map,此時tmp是pair<int,int>型別
map<int,int> mapp;
for (auto tmp : mapp)
;
cin/cout效率問題
- 原先總以為,stdio的效率高,其實差不多,而且甚至iostream更快
- 之所以,之前老因為cin T,是因為沒有關同步,iostream為了和stdio相容開啟了同步會慢
- ios::sync_with_stdio(false); //加上這句話就可以提高關同步
- 相應的,scanf, printf, gets等等就用不了了~
測試執行時間
- 在估複雜度困難的時候,可以考慮生成大資料檔案,讀檔案測試時間,對程式碼的不同部分測試時間
- 但是,不要盲信這個測試,會和在OJ上跑的情況有所不同的
- 測試得到的是毫秒級的
#include <time.h>
#include <iostream>
using namespace std;
int main(){
clock_t start;
start = clock();
//程式碼段1
cout << clock() - start() << endl;
start = clock();
//程式碼段2
cout << clock() - start() << endl;
//...
return 0;
}