1. 程式人生 > >ACM數論一些簡單結論和程式設計小技巧總結

ACM數論一些簡單結論和程式設計小技巧總結

前言

  • 最近被數論的模運算卡了一發。。稍微總結一下最近用到的數論結論
  • 另外,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; }