刷算法题总结的一些结论公式
生活随笔
收集整理的這篇文章主要介紹了
刷算法题总结的一些结论公式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
根據之前刷過的題還是總結一下結論和模板吧。不然一會兒就又忘完了。
感覺知道一些結論做題是很有幫助的。
目錄
- 快速的判斷一個大數是不是3的倍數,或9的倍數
- 判斷一個字符串是不是回文
- 求n!的約數個數
- 判斷是不是潤年
- 求n!轉化成2進制的位數
- 以知三角形的邊求面積
- 約瑟夫環問題
- 倆數互質,最大不可以組合出的數字
- 等比數列,等差數列求和公式
- 求一個數轉換成2進制中1的個數
- 大數與大數的乘法
- 一元三次方程求解
- 凸多邊形對角線交點的個數
- 平面上有N條直線,最多有幾個交點
- 用N個三角形最多可以把平面分成幾個區域
- 多重集的排列組合問題
- 求一個數的約數之和。
- 階乘的末尾零的個數
- 求倆字符串的最長不公共子序列
- 加速輸入輸出流
- map嵌套pair
- 求階乘某一個因子出現的次數。
- 棋盤遍歷問題
- 求[1,n]所有數的約數個數之和的問題
- 質數的平方數只有三個因子
快速的判斷一個大數是不是3的倍數,或9的倍數
將這個數的所有位的數相加,如果mod3等于0就是3的倍數,如果mod9等于0就是9的倍數
詳細的推理過程
注意: 這里只適用于 3和9。
判斷一個字符串是不是回文
bool check(string s) {string a=s; reverse(a.begin(),a.end());return s==a; }求n!的約數個數
一個數約數的個數等于這個數分解質因子后,(每個質數的個數+1)的乘積
typedef long long int LL; map<LL,LL>mp; void f(LL x) {for(int i=2;i<=x/i;i++) while(x%i==0) mp[i]++,x/=i;if(x!=1) mp[x]++; } LL solve(int n) {LL ans=1;for(int i=2;i<=n;i++) f(i);for(auto i=mp.begin();i!=mp.end();i++) ans=ans*(i->second+1);return ans; }判斷是不是潤年
bool judge(int year) {if(year%400==0|| (year%4==0&&year%100!=0) ) return true;else return false; }求n!轉化成2進制的位數
LL solve(int n) {double sum=0;for(int i=1;i<=n;i++) sum+=log2(i);return sum+1; }以知三角形的邊求面積
double solve(int a,int b,int c) {double p=(a+b+c)/2;return sqrt(p*(p-a)*(p-b)*(p-c)); }約瑟夫環問題
公式推理
int solve(int n,int k)//1到n個人,報到k的最后留下來的編號 {int ans=0;for(int i=2;i<=n;i++) ans=(ans+k)%i;return ans+1; }倆數互質,最大不可以組合出的數字
ab-a-b==(a-1)*(b-1)-1
等比數列,等差數列求和公式
求一個數轉換成2進制中1的個數
int lowbit(int x){return x&-x;} int solve(int x)//輸入一個數x {int cnt=0;while(x) x-=lowbit(x),cnt++;return cnt; }大數與大數的乘法
vector<int> mul(vector<int> &A,vector<int> &B) {int t=0; vector<int> C;C.push_back(0);//目的是容器里初始化for(int j=0;j<B.size();j++){for(int i=0;i<A.size();i++){C.push_back(0);C[i+j]+=A[i]*B[j];}}for(int i=0;i<C.size();i++)//處理進位{if(C[i]>=10)C[i+1]+=C[i]/10,C[i]=C[i]%10;} while(C.size()>1&&C.back()==0) C.pop_back();//處理前導零return C; }一元三次方程求解
void solve(double a,double b,double c,double d)//只適用于三個解互相不通的情況。 {double A,B,C,T,ac,x1,x2,x3;A=b*b-3*a*c; B=b*c-9*a*d; T=(2*A*b-3*a*B)/(2*sqrt(A*A*A)); ac=acos(T); x1=(-b-sqrt(A)*cos(ac/3)*2)/3/a; x2=(-b+sqrt(A)*(cos(ac/3)-sqrt(3)*sin(ac/3)))/(3*a); x3=(-b+sqrt(A)*(cos(ac/3)+sqrt(3)*sin(ac/3)))/(3*a); printf("%.2lf %.2lf %.2lf",x1,x2,x3); }凸多邊形對角線交點的個數
首先一個交點對應兩條對角線,二這兩條對角線是有四個點確定的。
所以只要求Cn4C_n^4Cn4?就可以了 即 n(n-1)(n-2)(n-3)/24
平面上有N條直線,最多有幾個交點
倆線一個點,共 Cn2C_n^2Cn2?個點
int solve(int x){return x*(x-1)/2;}用N個三角形最多可以把平面分成幾個區域
f[i]=f[i-1]+6*(i-1)
推導
多重集的排列組合問題
實戰題目: 猴子排序的期望 , 擅長解密的小紅同學
求一個數的約數之和。
typedef long long int LL; const int mod=1e9+7; map<LL,LL>mp; void f(int x) {for(int i=2;i<=x/i;i++) while(x%i==0) mp[i]++,x/=i;if(x!=1) mp[x]++; } LL solve() {LL ans=1;for(auto i=mp.begin();i!=mp.end();i++){LL temp=1;int m=i->second;LL a=i->first;for(int j=1;j<=m;j++) temp=(temp*a+1)%mod;ans=(ans*temp)%mod;}return ans; }階乘的末尾零的個數
int solve(int n) {int ans=0;while(n) ans+=n/5,n/=5;return ans; }求倆字符串的最長不公共子序列
int solve(string a,string b) {if(a==b) return -1;else return max(a.size(),b.size()); }加速輸入輸出流
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);map嵌套pair
typedef pair<int,int> p; map<p,int> mp;mp[p(dx,dy)]++;求階乘某一個因子出現的次數。
int solve(int n,int x) {int ans=0;while(n) ans+=n/x,n/=x;return ans; }棋盤遍歷問題
給定一個 N×M 的方格棋盤,請問一個棋子從棋盤左上角出發,能否在不重復經過棋盤上的方格的情況下,遍歷整個棋盤一次再回到起點。 if(n==1&&m==1) puts("Y"); else if(n==1||m==1) puts("N"); else if(n%2==0||m%2==0) puts("Y"); else puts("N");求[1,n]所有數的約數個數之和的問題
LL n,ans=0; scanf("%lld",&n); for(LL i=1,j;i<=n;i=j+1)//節約時間 { j=n/(n/i);ans+=(n/i)*(j-i+1); } printf("%lld\n",ans);質數的平方數只有三個因子
總結
以上是生活随笔為你收集整理的刷算法题总结的一些结论公式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【PAT乙级题库】全套总结
- 下一篇: 谈C++求a+b(大神勿喷)