自己电脑做网站服务器广域网访问横岗网站建设
web/
2025/9/27 14:16:33/
文章来源:
自己电脑做网站服务器广域网访问,横岗网站建设,意大利语网站建设,做集团网站应注意什么自己还是太菜#xff0c;补题离不开题解。。。 但还是留个博客#xff0c;万一以后忘了。。。 1001 Different Circle Permutation Polya定理#xff0c;第一次遇见#xff0c;学习了一下。不旋转的时候可以得到 f[i]f[i-1]f[i-2] 斐波那契数列#xff0c;旋转后就可以通过…自己还是太菜补题离不开题解。。。 但还是留个博客万一以后忘了。。。 1001 Different Circle Permutation Polya定理第一次遇见学习了一下。不旋转的时候可以得到 f[i]f[i-1]f[i-2] 斐波那契数列旋转后就可以通过burnside引理求解循环节为 gcd(i,n)。 1 #include bits/stdc.h2 using namespace std;3 typedef long long LL;4 const LL mod1e97;5 LL pow_mod(LL a,LL n){6 LL res1,ta%mod;7 while(n){8 if(n1) res(res*t)%mod;9 t(t*t)%mod;
10 n/2;
11 }
12 return res;
13 }
14 struct Mat{
15 LL a[2][2];
16 void init(){
17 a[0][0]1;
18 a[1][0]a[0][1]1;
19 a[1][1]0;
20 }
21 };
22 Mat operator *(Mat a,Mat b){
23 Mat c;
24 for(LL i0;i2;i)
25 for(LL j0;j2;j){
26 c.a[i][j]0;
27 for(LL k0;k2;k)
28 c.a[i][j]a.a[i][k]*b.a[k][j];
29 c.a[i][j]%mod;
30 }
31 return c;
32 }
33 Mat operator ^(Mat p,LL k){
34 Mat ans; ans.init();
35 while(k){
36 if(k1)
37 ansans*p;
38 k/2;
39 pp*p;
40 }
41 return ans;
42 }
43 LL fun(LL x){
44 Mat a; a.init();
45 Mat b;
46 b.a[0][0]1;
47 b.a[0][1]0;
48 b.a[1][0]2;
49 b.a[1][1]0;
50 aa^(x-2);
51 if(x1) ba*b;
52 return b.a[0][0];
53 }
54 LL n;
55 LL euler(LL n){
56 LL ansn;
57 for(LL i2;i*in;i){
58 if(n%i0){
59 ans-ans/i;
60 while(n%i0) n/i;
61 }
62 }
63 if(n1) ans-ans/n;
64 return ans;
65 }
66 int main(){
67 while(~scanf(%lld,n)){
68 if(n1){
69 printf(%lld\n,2);
70 continue;
71 }
72 LL ans0;
73 for(LL i1;i*in;i){
74 if(n%i0){
75 ansfun(i)*euler(n/i)%mod;
76 if(n/i!i) ansfun(n/i)*euler(i)%mod;
77 ans%mod;
78 }
79 }
80 ansans*pow_mod(n,mod-2)%mod;
81 printf(%lld\n,ans);
82 }
83
84 return 0;
85 } Psong 1002 Different GCD Subarray Query 查询区间内不同gcd个数区间gcd可以ST表打出并提前二分处理出每个点向右gcd下降的地方。查询作为点对以右端点大小排序然后用树状数组处理。 1 #include bits/stdc.h2 using namespace std;3 4 int n,q;5 int k[100005];6 7 int kk;8 struct node{9 int l,r,pos;10 } a[100005];11 bool cmp(node x,node y){12 return x.ry.r;13 }14 15 int gcd(int x,int y){16 return y0?x:gcd(y,x%y);17 }18 19 int lg[100005];20 int dp[100005][35];21 int RMQ_ST(int n){22 for(int i1;in;i) lg[i](int)( log(1.0*i)/log(2.0) );23 for(int i1;in;i) dp[i][0]k[i];24 for(int j1;(1j)n;j){25 for(int i1;in-(1j)1;i){26 dp[i][j]gcd( dp[i][j-1],dp[i(1(j-1))][j-1] );27 }28 }29 }30 int find_gcd(int l,int r){31 int klg[r-l1];32 return gcd(dp[l][k],dp[r-(1k)1][k]);33 }34 35 int ans[100005];36 int c[100006];37 vectorint vr[100005];38 39 int lowbit(int x){40 return x(-x);41 }42 int add(int pos,int val){43 for(int ipos;in;ilowbit(i)){44 c[i]val;45 }46 }47 int sum(int pos){48 int res0;49 for(int ipos;i0;i-lowbit(i)){50 resc[i];51 }52 return res;53 }54 55 void init(){56 for(int i1;in;i){57 vr[i].push_back(i);58 int tmpk[i];59 int l1,ri;60 while(lr){61 int Ll,Rr,flag0;62 while(LR){63 int mid(LR1)/2;64 if(find_gcd(mid,i)tmp) Lmid;65 else if(find_gcd(l,i)tmp) Rmid-1;66 else { flag1;break; }67 }68 if(!flag){69 tmpfind_gcd(R,i);70 vr[i].push_back(R);71 }72 else break;73 rR;74 }75 }76 }77 int pos[1000006];78 void solve(){79 int R0;80 for(int i1;iq;i){81 while(Ra[i].r){82 R;83 for(int j0;jvr[R].size();j){84 int llvr[R][j];85 int _gcdfind_gcd(ll,R);86 if(pos[_gcd]0) add(ll,1);87 else if(pos[_gcd]ll) add(ll,1),add(pos[_gcd],-1);88 pos[_gcd]max(pos[_gcd],ll);89 }90 }91 ans[a[i].pos]sum(a[i].r)-sum(a[i].l-1);92 }93 }94 95 int main(){96 while(scanf(%d%d,n,q)!EOF){97 for(int i1;in;i) scanf(%d,k[i]);98 RMQ_ST(n);99 init();
100 kksqrt(n);
101 for(int i1;iq;i){
102 scanf(%d%d,a[i].l,a[i].r);
103 a[i].posi;
104 }
105 sort(a1,a1q,cmp);
106 memset(c,0,sizeof(c));
107 memset(pos,0,sizeof(pos));
108 //coutsum(1)endl;
109 solve();
110 for(int i1;iq;i) printf(%d\n,ans[i]);
111 }
112
113
114 return 0;
115 }
116 /*
117 9 10
118 3 3 4 4 4 6 6 6 9
119 */ Psong 1003 Alices Adventure in Wonderland 1004 Number of Connected Subgraph 1005 Seats 1006 Football Games 排序后判断前 i 个和不能少于 i*(i-1)/2 且总数为 n*(n-1)/2 即可。 1 #include bits/stdc.h2 using namespace std;3 int n;4 int b[20005];5 int main(){6 int t;7 while(cint){8 while(t--){9 cinn;
10 for(int i1;in;i) cinb[i];
11 int sum0,flag0;
12 for(int i1;in;i){
13 sumb[i];
14 if(sumi*(i-1)) flag1;
15 }
16 if(sum!n*(n-1)) flag1;
17 if(flag0) coutTendl;
18 else coutFendl;
19 }
20 }
21
22 return 0;
23 } Psong 1007 Friends and Enemies 最多的情况为把所有人平均分成两组然后内部互为敌人外部互为朋友即可。 1 #include bits/stdc.h2 using namespace std;3 long long n,m;4 int main(){5 while(cinnm){6 if(m(n-n/2)*(n/2)) coutTendl;7 else coutFendl;8 }9
10 return 0;
11 } Psong 1008 Function 查询区间最左边的一个数向右取模后的结果每次取模下降至少为一半所以ST表打出最小值然后对每个询问依次二分出向右的第一个比当前值小的位置。 1 #include bits/stdc.h2 using namespace std;3 int n,m;4 int a[100005];5 int dp[100005][35];6 int lg[100005];7 void RMQ_ST(int n){8 for(int i1;in;i) lg[i](int)(log(1.0*i)/log(2.0));9 for(int i1;in;i) dp[i][0]a[i];
10 for(int j1;(1j)n;j){
11 for(int i1;in-(1j)1;i){
12 dp[i][j]min( dp[i][j-1],dp[i(1(j-1))][j-1] );
13 }
14 }
15 }
16 int find_min(int l,int r){
17 int klg[r-l1];
18 return min(dp[l][k],dp[r-(1k)1][k]);
19 }
20 void solve(int l,int r){
21 int resa[l];
22 int Ll1,Rr;
23 while(lr){
24 while(LR){
25 int mid(LR)/2;
26 if(find_min(l1,mid)res) Rmid;
27 else Lmid1;
28 }
29 if(find_min(l1,L)res) LR;
30 res%a[L];
31 L; Rr;
32 if(find_min(l1,r)res) break;
33 }
34 printf(%d\n,res);
35 }
36 int main(){
37 int t;
38 scanf(%d,t);
39 while(t--){
40 scanf(%d,n);
41 for(int i1;in;i) scanf(%d,a[i]);
42 RMQ_ST(n);
43 scanf(%d,m);
44 while(m--){
45 int l,r;
46 scanf(%d%d,l,r);
47 solve(l,r);
48 }
49 }
50
51 return 0;
52 }
53 /*
54 6
55 18 30 15 8 6 4
56 */ Psong 1009 Sparse Graph 补图最短路用两个set维护还没有记录的点和与当前点相连的点。 #include bits/stdc.h
using namespace std;
vectorint g[200005];
int dis[200005];
int n,m,s;
int u,v;
void bfs(){queueint q; q.push(s);setint s1,s2;for(int i1;in;i)if(i!s) s1.insert(i);while(!q.empty()){int uq.front(); q.pop();for(int i0;ig[u].size();i){int vg[u][i];if(s1.find(v)!s1.end()){s1.erase(v);s2.insert(v);}}setint::iterator its1.begin();for(;it!s1.end();it){dis[(*it)]dis[u]1;q.push(*it);}swap(s1,s2);s2.clear();}vectorint ans;for(int i1;in;i)if(i!s) ans.push_back(dis[i]);for(int i0;ians.size();i){if(i0) printf(%d,ans[i]);else printf( %d,ans[i]);}printf(\n);
}
int main(){int t;scanf(%d,t);while(t--){scanf(%d%d,n,m);memset(dis,-1,sizeof(dis));for(int i1;in;i) g[i].clear();for(int i1;im;i) {scanf(%d%d,u,v);g[u].push_back(v);g[v].push_back(u);}scanf(%d,s); dis[s]0;bfs();}return 0;
}
/*
2
5 6
1 2
1 3
2 4
3 4
2 5
4 5
2
*/ Psong 1010 Weak Pair 离散化后dfs用树状数组记录每个数出现个数然后直接计数当处理完一个点的时候要把这个这个值删除。 1 #include bits/stdc.h2 using namespace std;3 typedef long long LL;4 LL n,k;5 LL root;6 LL a[100005];7 LL in[100005];8 vectorLL g[100005];9 LL cnt;
10 LL c[500005];
11 LL lowbit(LL x){
12 return x(-x);
13 }
14 void add(LL pos,LL val){
15 for(LL ipos;icnt;ilowbit(i)){
16 c[i]val;
17 }
18 }
19 LL sum(LL pos){
20 LL res0;
21 for(LL ipos;i0;i-lowbit(i)){
22 resc[i];
23 }
24 return res;
25 }
26 vectorLL v;
27 LL getid(LL x){
28 return lower_bound(v.begin(),v.end(),x)-v.begin()1;
29 }
30
31 LL ans;
32 void dfs(LL u){
33 LL idgetid(a[u]);
34 if(a[u]){
35 anssum(getid(k/a[u]));
36 add(id,1);
37 }
38 else{
39 anssum(cnt);
40 add(1,1);
41 }
42 for(LL i0;ig[u].size();i){
43 dfs(g[u][i]);
44 }
45 if(a[u]) add(id,-1);
46 else add(1,-1);
47 }
48 int main(){
49 LL t;
50 scanf(%lld,t);
51 while(t--){
52 v.clear(); v.push_back(0);
53 memset(c,0,sizeof(c));
54 memset(in,0,sizeof(in));
55 scanf(%lld%lld,n,k);
56 for(LL i1;in;i){
57 g[i].clear();
58 scanf(%lld,a[i]);
59 v.push_back(a[i]);
60 if(a[i]!0) v.push_back(k/a[i]);
61 }
62 for(LL i1;in;i){
63 LL u,v;
64 scanf(%lld%lld,u,v);
65 g[u].push_back(v);
66 in[v];
67 }
68 sort(v.begin(),v.end());
69 v.erase(unique(v.begin(),v.end()),v.end());
70 cntv.size(); ans0;
71 for(LL i1;in;i){
72 if(in[i]0) rooti;
73 }
74 dfs(root);
75 printf(%lld\n,ans);
76 }
77
78
79 return 0;
80 } Psong 转载于:https://www.cnblogs.com/N-Psong/p/7141906.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/81089.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!