日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

在ACM的巨坑里挣扎的弱鸡整理的模板

發布時間:2023/12/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在ACM的巨坑里挣扎的弱鸡整理的模板 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
頭文件,定義,等等
#include <cstdio> #include <cstring> #include <cstdlib> #include <math.h> #include <iostream> #include <algorithm> #include <string> #include <vector> #include <set> #include <map> #include <queue> #include <stack> #include <iomanip>#define ll long long #define ull unsigned long long #define Pi 3.1415927 #define maxn 100005 #define debug cout<<"*******"<<endl using namespace std; const int minn = 1e-9; const int INF = 0x3f3f3f3f; const int mod = 1e9+7; int main(){std::ios::sync_with_stdio(false);//提高cin效率return 0; }
cout格式化輸出
#include <iomanip>//頭文件 //感覺就是沒有printf好用!
字符串:
//逆置字符串 reverse(s.begin(),s.end());//無返回值,原字符串被逆置。
數學
//兩點間距離 (x1,y1),(x2,y2) sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)) //球的體積公式 半徑r 4*Pi*r*r*r/3 //一元二次方程求根公式 x1 = (-b + sqrt(b*b - 4*a*c))/(2a) x2 = (-b - sqrt(b*b - 4*a*c))/(2a) //一元二次方程配方法 ax^2 + bx + c = 0(a != 0) (x - b/2a)^2 = -c/a + (b/2a)^2

除法取模

1.(a/b)%mod=a%(b*mod)/b%mod; 2.(a/b)%mod=a*b^(mod-2)%modmod為素數
日期
bool is_Leap(int n){//是否為閏年if(n % 4 == 0 && n % 100 != 0 || n % 400 == 0) return true;return false; } //月,閏年時二月+1 int month[] = {0,31,28,31,30,31,30,31,31,30,31,30,31}; //求y年m月d日到1年1月1日時的天數 int getDays(int y,int m,int d){int days = 0;for(int i = 1; i < y;i++){days += 365;if(is_Leap(i)){days += 1;}}for(int i = 1; i < m;i++){days += month[i];if(i == 2 && is_Leap(y)){days += 1;}}days += d;return days; }
位運算
a & b //與運算 a | b //或運算 a ^ b //異或運算 c >>= 1;//等價于c /= 2 //奇偶 if(c&1) is_odd; else is_even;
冪運算
//快速冪 int pow(int a,int b){int ans = 1;while(b!=0){if(b&1) ans *= a;a *= a;b >>= 1;}return ans; } //快速冪取模 int f(int a,int b,int m){int ans = 1;a = a % m;while(b){if(b&1){ans = ans * a % m;}a = a * a % m;b>>=1;}return ans; } //矩陣快速冪 void matMulti(int a[][N], int b[][N], int n) {//求a*b,并將相乘結果存入a中int temp[N][N]; //先將a與b的乘積存入temp,然后再將其存入a memset(temp, 0, sizeof(temp));for(int i = 0;i < n;i++){for(int j = 0;j < n;j++)for(int k=0;k< n;k++) temp[i][j]+=a[i][k]*b[k][j]; } //該循環求a*b,并存入了temp for(int i=0;i<n;i++) //將temp中的值轉存入a for(int j=0;j<n;j++) a[i][j]=temp[i][j]; } void matPow(int a[][N], int n) { //求N*N矩陣a的n次冪 int ans[N][N]; //ans用來存放最終結果 memset(ans, 0, sizeof(ans)); //將矩陣ans的所有元素置為0 for(int i=0; i<n; i++) ans[i][i] = 1; //設置單位矩陣 while(n) { if(n&1) matMulti(ans, a, N); // ans = ans*a; matMulti(a, a, N); //a = a*a,n=n>>1; //n = n/2 ;} return ; } //矩陣快速冪結構體表示---求第n個菲波那切數 #include<bits/stdc++.h> #define ll long long #define mod 1000000009 using namespace std; struct Node{ll c[2][2]; }ans; Node mult(Node a,Node b){Node c = {0};for(int i=0;i<2;i++){for(int j=0;j<2;j++){for(int k=0;k<2;k++){c.c[i][j] += (a.c[i][k] * b.c[k][j]) % mod;c.c[i][j] %= mod;}}}return c; } Node mulPow(ll n){Node res = ans;if(n<0) return res;while(n){if(n&1) res = mult(res,ans);ans = mult(ans,ans);n>>=1;}return res; } void init(){ans.c[0][0] = 1;ans.c[0][1] = 1;ans.c[1][0] = 1;ans.c[1][1] = 0; } int main(){ll n;while(cin>>n){init();Node a = mulPow(n-2);cout<<a.c[0][0]*1<<endl;} return 0;}
擴展歐幾里得
int exgcd(int a,int b,int &x,int &y) {if(b==0){x=1;y=0;return a; //返回最大公約數}int r=exgcd(b,a%b,x,y);int t=x;//一次一更新x和yx=y;y=t-a/b*y;return r;//返回最大公約數 }
并查集
int find(int root){//紫皮書的findreturn pre[root] == root ? root : pre[root] = find(pre[root]); } int find(int root)//自己整理的 { int son, tmp; son = root; while(root != pre[root]) root = pre[root]; while(son != root) { tmp = pre[son]; pre[son] = root; son = tmp; } return root; } void join(int root1, int root2)//連接 { int x, y; x = find(root1);y = find(root2);if(x != y) pre[x] = y; }
動態規劃典型問題狀態轉移方程
//數字三角形: f[i][j]=max(f[i?1][j],f[i?1][j?1])+a[i][j]
最小生成樹—克魯斯卡爾
struct Edge{ //結點結構體int u,v,w;Edge(){}Edge(int u,int v,int w){//構造方法this->u = u;this->v = v;this->w = w;}bool operator < (const Edge &a){//排序規則return w < a.w;} }; char a,b; Edge e[maxn]; int pa[90]; void init(){//并查集初始化for(int i = 0; i <= 30; i++){pa[i] = i;} } int findset(int x){//尋找集合代表并進行路徑壓縮return x == pa[x] ? x : pa[x] = findset(pa[x]); } int main(){std::ios::sync_with_stdio(false);int n,m,x,w;while(cin>>n && n){m = 0;int cnt = n;n--;while(n--){cin>>a>>x;int u = a - 'A' + 1;while(x--){cin>>b>>w;int v = b - 'A' + 1;e[m++] = Edge(u,v,w);//添加邊,并記錄邊的個數。}}sort(e,e+m);int cost = 0;//花費init();for(int i = 0; i < m; i++){//貪心,每次找最小花費的邊,如果是不同樹中的,添加到最小生成樹中Edge u = e[i];int x = u.u;int y = u.v;x = findset(x);y = findset(y);if(x != y){cost += u.w;pa[x] = y;cnt--;}if(cnt == 1){break;}}cout<<cost<<endl;}return 0; }

最短路徑 迪杰斯特拉

int n; struct Edge{int from,to,dist;Edge(int u,int v,int d):from(u),to(v),dist(d){} }; struct HeapNode{int d,u;HeapNode(int td,int tu) : d(td) , u(tu) { }bool operator < (const HeapNode& rhs) const{return d > rhs.d;} }; struct Dijkstra{int m;vector<Edge> edges;vector<int> G[maxn];bool done[maxn];int d[maxn];int p[maxn];void init(){for(int i = 0; i <= n+1;i++){G[i].clear();}edges.clear();}void AddEdge(int from,int to,int dist){edges.push_back(Edge(from,to,dist));m = edges.size();G[from].push_back(m-1);}void dijkstra(int s){priority_queue <HeapNode> Q;for(int i = 0; i <= n+1; i++){d[i] = INF;}d[s] = 0;memset(done,0,sizeof(done));Q.push(HeapNode(0,s));while(!Q.empty()){HeapNode x = Q.top();Q.pop();int u = x.u;if(done[u]) continue;done[u] = true;for(int i = 0; i < G[u].size();i++){Edge &e = edges[G[u][i]];if(d[e.to] >= d[u] + e.dist){d[e.to] = d[u] + e.dist;p[e.to] = u;Q.push(HeapNode(d[e.to],e.to));}else if(d[e.to] == d[u] + e.dist){p[e.to] = min(G[u][i], p[e.to]);}}}} }D; int main(){std::ios::sync_with_stdio(false);int T,m;cin>>T;while(T--){D.init();cin>>n>>m;int u,v,w;for(int i = 0; i < m;i++){cin>>u>>v>>w;D.AddEdge(v,u,w);}D.dijkstra(n+1);if(D.d[0] >= INF){cout<<-1<<endl;}else if(D.p[0] == n+1){cout<<0<<endl;}else{cout<<D.p[0]<<endl;}}return 0; }

母函數:

多項式為:(1+x)*(1+x^2)*(1+x^10+x^15)= (1+x^2+x+x^3)*(1+x^10+x^15) = (1+x^10+x^15) + x^2*(1+x^10+x^15) +x*(1+x^10+x^15) +x^3*(1+x^10+x^15) =(1+x^10+x^15) +(x^2+x^12+x^17) +(x+x^11+x^16) +(x^3+x^13+x^18)=1+x+x^2+x^3+x^10+x^11+x^12+x^13+x^15+x^16+x^17+x^18 int main(){int v[] = {1,2,5};int n1[] = {0,0,0};int n2[3];int a[maxn],b[maxn];while(cin>>n2[0]>>n2[1]>>n2[2] && (n2[0] != 0 || n2[1] != 0 || n2[2] != 0)){int k = n2[0]+2*n2[1]+5*n2[2];memset(a,0,sizeof(a));a[0] = 1;for(int i = 0;i<=2;i++){memset(b,0,sizeof(b));for(int j = n1[i];j<=n2[i]&&j*v[i]<=k;j++){for(int t = 0; t+j*v[i]<=k;t++){b[t+j*v[i]] += a[t];}}memcpy(a,b,sizeof(b));}bool f = true;for(int i = 1;i < k;i++){if(a[i]==0){cout<<i<<endl;f = false;break;}}if(f){cout<<k+1<<endl;}}return 0; }

廣搜

int bfs(int n) {queue<node> que;node fr,en;fr.n=n,fr.step=0;book[n]=1;que.push(fr);while(!que.empty()){fr=que.front();que.pop();if(fr.n==K)return fr.step;for(int i=0;i<3;i++){step[2]=fr.n;en.n=fr.n+step[i];if(en.n>=0&&en.n<=Max&&book[en.n]==0){book[en.n]=1;en.step=fr.step+1;que.push(en);}}}return -1; }

素數篩法(1不是素數)

int prime[maxn]; bool is_prime[maxn];int sieve(int n){int p = 0;for(int i = 0; i <= n; ++i)is_prime[i] = true;is_prime[0] = is_prime[1] = false;for (int i = 2; i <= n; ++i){ // 注意數組大小是nif(is_prime[i]){prime[p++] = i;for(int j = i + i; j <= n; j += i)//輕剪枝,j必定是i的倍數is_prime[j] = false;}}return p; // 返回素數個數 }

總結

以上是生活随笔為你收集整理的在ACM的巨坑里挣扎的弱鸡整理的模板的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。