
算法
bonely
这个作者很懒,什么都没留下…
展开
-
组合数学(持续更新)
文章目录排列与组合四个基本计数原理集合的排列排列与组合四个基本计数原理(1)(1)(1) 加法原理: 设集合 SSS 被划分成两两不相交的部分 S1S_1S1, S2S_2S2 … SmS_mSm, 则 SSS的对象数目可以通过确定它的每一个部分的对象数目并如此相加而得到 :∣S∣=∣S1∣+∣S2∣+...+∣Sm∣{\vert S \vert} = {\vert S_1 \vert} + {\vert S_2 \vert} +...+ {\vert S_m \vert}∣S∣=原创 2021-09-03 22:23:12 · 1190 阅读 · 4 评论 -
Gregor and Cryptography
题目:题目链接:题解:质数一定是奇数,所以选择 p−1p-1p−1 和 p/2p/2p/2#include <bits/stdc++.h>using namespace std;int main(){ int t; cin>>t; while(t--) { long long n; cin>>n; cout<<n/2<<" "<<n-1<<endl; } return 0;}..原创 2021-08-02 22:21:43 · 194 阅读 · 0 评论 -
2021牛客暑期多校训练营3
文章目录B--Black and whiteE--MathJ--Counting TrianglesB–Black and white题目链接:题解:#include<bits/stdc++.h>#define ll long longusing namespace std;const int maxn = 5005;struct node { int u,v; ll w; bool operator < (const node&原创 2021-07-31 23:55:03 · 115 阅读 · 0 评论 -
2021牛客暑期多校训练营4
题目:题目链接题意:LCS(s1,s2)LCS(s1,s2)LCS(s1,s2)表示 s1s1s1 和 s2s2s2 的最长公共子序列给定三个字符串 s1s1s1, s2s2s2,s3s3s3,要求满足 LCS(s1,s2)=aLCS(s1,s2) = aLCS(s1,s2)=a, LCS(s2,s3)=bLCS(s2,s3) = bLCS(s2,s3)=b, LCS(s1,s3)=cLCS(s1,s3) = cLCS(s1,s3)=c输出满足要求的 s1,s2,s3s1,s2,s3s1,s2原创 2021-07-31 13:54:45 · 133 阅读 · 0 评论 -
2021牛客暑期多校训练营2
文章目录C--Draw GridsD--Er Ba GameC–Draw Grids题目链接:题意:总共有 n∗mn*mn∗m 个点, 两人轮流选取两个点连一条线, 不能连已经连过的线, 并且连成的图形不能形成闭合回路, 两人都选取最优策略,最后不能操作的人输题解:判断奇偶性就好#include <bits/stdc++.h>using namespace std;int main(){ int n,m; cin>>n>>m原创 2021-07-25 23:11:58 · 158 阅读 · 1 评论 -
2021牛客暑期多校训练营1
文章目录Alice and BobBall Dropping在补了....Alice and Bob题目链接:题意:总共有两堆石头,每次可以从一堆中取走 kkk (k>0)(k>0)(k>0)块石头,从另一堆取走 s∗ks*ks∗k (s>=0)(s>=0)(s>=0)块石头, 不能操作的人输题解:用一个二维数组 f[i][j]f[i][j]f[i][j] 储存状态, f[i][j]f[i][j]f[i][j] 为 111 代表有两堆石头分别有i原创 2021-07-23 22:12:46 · 178 阅读 · 0 评论 -
I love exam
题目:题目链接:题解:参考:链接:f[i][j]f[i][j]f[i][j] 表示第 iii 门课程,花费 jjj 天可以得到的最大分数dp[i][j][k]dp[i][j][k]dp[i][j][k] 表示前 iii 门课,花费 jjj 天, 挂 kkk 门课可以得到的最大分数记得初始化转移:f[i][z]<60f[i][z]<60f[i][z]<60dp[i][j][k]=max(dp[i][j][k],dp[i−1][j−z][k−1]+f[i][z])dp[i][原创 2021-07-23 17:59:24 · 155 阅读 · 0 评论 -
KD-Graph
题目:链接题意:总共有 nnn 个点,mmm条边,要分成 kkk 组,满足(1)(1)(1) 如果顶点 p 和 q ( p ≠ q ) 在同一组中,则 p 和 q 之间必须至少有一条路径满足该路径中的最大值小于或等于 D。(2)(2)(2) 如果顶点 p 和 q ( p ≠ q ) 在不同的组中,则 p 和 q 之间不可能有任何路径满足该路径中的最大值小于或等于 D。题解:最开始分为cnt=ncnt=ncnt=n个组按找点的边权从小到大排序, 如果这两个点不在同一个集合中,则将它们合并到一个原创 2021-07-23 16:32:53 · 174 阅读 · 0 评论 -
P2257 YY的GCD
题目:题目链接:题解:莫比乌斯反演#include <bits/stdc++.h>#define N 10000010using namespace std;long long pri[N],cnt,g[N];bool st[N];long long mu[N],sum[N];void get_mu(){ mu[1]=1; for(long long i=2;i<N;i++) { if(!st[i]){mu[i]=-1;pri原创 2021-05-24 22:25:43 · 88 阅读 · 0 评论 -
P1829 [国家集训队]Crash的数字表格 / JZPTAB
题目:题目链接:题解:莫比乌斯反演#include <bits/stdc++.h>using namespace std;long long mod=20101009;const int N=1e7+10;long long mu[N],pri[N],con,sum[N];bool st[N];long long n,m;void getmus(){ mu[1]=1; for(int i=2;i<=N;i++) { if(!原创 2021-05-24 22:19:07 · 89 阅读 · 0 评论 -
P4450 双亲数
题目:题目链接:题解:莫比乌斯反演即求∑i=1n∑j=1m[gcd(i,j)=k]\sum_{i=1}^{n} \sum_{j=1}^{m} {[gcd(i,j)=k]}∑i=1n∑j=1m[gcd(i,j)=k]∑i=1n∑j=1m[gcd(i,j)=k]\sum_{i=1}^{n} \sum_{j=1}^{m} {[gcd(i,j)=k]}∑i=1n∑j=1m[gcd(i,j)=k]=∑i=1[n/k]∑j=1[m/k][gcd(i,j)=1]\sum_{i=1}^{[n/k]} \原创 2021-05-22 21:43:26 · 111 阅读 · 0 评论 -
2020ICPC 江西省大学生程序设计竞赛 A Simple Math Problem
题目:题目链接:题解:莫比乌斯反演推导过程如下∑i=1n∑j=1iF[j][gcd(i,j)=1]\sum_{i=1}^{n}\sum_{j=1}^{i} {F[j][gcd(i,j)=1]}∑i=1n∑j=1iF[j][gcd(i,j)=1]可以转化为 ∑i=1nF[i]∑j=ingcd[(i,j)=1]\sum_{i=1}^{n}{F[i]} \sum_{j=i}^{n} {gcd[(i,j)=1]}∑i=1nF[i]∑j=ingcd[(i,j)=1]∑i=1nF[i]∑j原创 2021-05-22 21:32:33 · 370 阅读 · 0 评论 -
区间选点
题目:题解:贪心,根据右端点排序#include <bits/stdc++.h>using namespace std;struct node { long long a,b;}p[100005];bool cmp(node x,node y){ return x.b<y.b;}int main(){ int n; cin>>n; for(int i=0;i<n;i++) { cin原创 2021-05-21 23:15:25 · 94 阅读 · 0 评论 -
Codeforces Round #721 (Div. 2) B2. Palindrome Game (hard version)
题目:题目链接:题解:先数出有多少个位置不匹配,如果为000则和B1B1B1一样,如果为111则alice第一轮翻转,bob必须得第一个填,如果0 的数量大于2则bob必败,不匹配位置大于1,则alice必胜#include <bits/stdc++.h>using namespace std;int main(){ int t; cin>>t; while(t--) { int n; cin>>n; string a; cin>原创 2021-05-21 23:11:59 · 122 阅读 · 0 评论 -
Codeforces Round #721 (Div. 2) B1. Palindrome Game (easy version)
题目:题目链接题解:#include <bits/stdc++.h>using namespace std;int main(){ int t; cin>>t; while(t--) { int n; cin>>n; string a; cin>>a; int con=0; for(int i=0;i<n;i++) { if(a[i]=='0') con++; } if(con%2==0)原创 2021-05-21 22:47:19 · 156 阅读 · 0 评论 -
区间覆盖
题目:题解:贪心策略先按照左端点排序,对于每一次选择,选择当前区间的左端点能覆盖到线段左端点的区间,并且覆盖到的线段的右端点是最长的那个,如果不能覆盖则无解#include <bits/stdc++.h>using namespace std;struct node { long long a,b;}e[100005];bool cmp(node x,node y){ return x.a<y.a;}int main(){ std::ios原创 2021-05-21 22:44:21 · 123 阅读 · 0 评论 -
最大异或对
题解:题解:用trie树存储每一个数,从最大位开始,每次选择不同的#include <bits/stdc++.h>using namespace std;const int N=1e5+10;const int M=31*N;int son[M][2],idx;int a[N];int qurry(int x){ int p=0; int ans=0; for(int i=30;i>=0;i--) { int u=x&g原创 2021-05-19 23:19:27 · 89 阅读 · 0 评论 -
区间分组
题解:题解:可以把题转化为求最大重叠的区间数量#include <bits/stdc++.h>using namespace std;#define faster ios::sync_with_stdio(false);cin.tie(0),cout.tie(0)long long p[200005];int idx;int main(){ faster; int n; cin>>n; for(int i=1;i<=n;i++原创 2021-05-19 23:16:56 · 145 阅读 · 0 评论 -
2020ICPC 江西省大学生程序设计竞赛 K-Travel Expense
题目:题目链接:题解:最短路+二分#include <bits/stdc++.h>using namespace std;int pos[105][105];int inf =0x3f3f3f3f;int n,m;long long s,t,w;void floyd(){ for(int k=1;k<=n;k++) { for(int i=1;i<=n;i++) { for(int j=1;原创 2021-05-18 22:03:45 · 196 阅读 · 0 评论 -
最大公约数(欧拉函数)
题目:题解:注意数据范围#include <bits/stdc++.h>using namespace std;typedef long long ll;const ll N=1e7+10;int pri[N],s[N],st[N],con,primes[N];void oula(ll n){ pri[1]=1; for(ll i=2;i<=n;i++) { if(!st[i]) { pr原创 2021-05-17 22:22:11 · 274 阅读 · 0 评论 -
可见的点
题目:题解:先考虑x=yx=yx=y一边的情况,如果可见,则横纵坐标互质,所以使用欧拉函数,求出对于每一个横坐标xxx,求出oula(x)oula(x)oula(x),相加,得到一边情况,乘以二,是两边的情况,再加上一个线上的特殊情况x=1x=1x=1#include <bits/stdc++.h>using namespace std;int pri[1005],st[1005],primes[1005];int con;void oula(){ pri[1]=1;原创 2021-05-17 22:14:45 · 197 阅读 · 0 评论 -
能被整除的数
题解:题解:充斥原理,用二进制优化表示选和没选,选的质数个数为奇数的时候加入答案,偶数时候减去#include <bits/stdc++.h>using namespace std;typedef long long ll;ll p[20];int main(){ ll n,m; cin>>n>>m; ll ans=0; for(int i=1;i<=m;i++) cin>>p[i]; for(原创 2021-05-17 22:10:04 · 288 阅读 · 0 评论 -
表达整数的奇怪方式
题目:题解:中国剩余定理的推论#include <bits/stdc++.h>using namespace std;typedef long long ll;ll exgcd(ll a,ll b,ll &x,ll &y){ if(b==0) { x=1; y=0; return a; } ll gcd; gcd=exgcd(b,a%b,y,x); y-=a/b*x;原创 2021-05-17 22:07:57 · 115 阅读 · 0 评论 -
最小花费
题目:题解:最短路即可#include <bits/stdc++.h>using namespace std;double pos[2005][2005];int vis[2005];double dis[2005];int n,m;int inf =0x3f3f3f3f;int s,e;void dij(){ //memset(dis,inf,sizeof(dis)); dis[s]=1.0; for(int i=1;i<=n;i++)原创 2021-05-14 23:21:43 · 110 阅读 · 0 评论 -
同余方程
题目:题解:线性同余方程#include <bits/stdc++.h>using namespace std;long long exgcd(long long a,long long b,long long &x,long long &y){ if (!b) { x = 1, y = 0; return a; } long long d = exgcd(b, a % b, x, y); l原创 2021-05-14 23:19:20 · 118 阅读 · 0 评论 -
反素数
题目:题解:题目转化为求约数个数最多的最小的数假设每一个质因子都使用一次,可以发现最多使用九个质因子,因为2∗3∗...∗232 * 3 *... * 232∗3∗...∗23 < 2e92e92e92∗3∗...∗23∗292 * 3 * ... * 23 * 292∗3∗...∗23∗29 > 2e92e92e9而且每个质因子最多用303030次,因为 2302^{30}230 < 2e92e92e9, 2312^{31}231 > 2e92e92e9且对于每一个原创 2021-05-13 21:16:42 · 112 阅读 · 0 评论 -
樱花
题目:题解:我们先筛出质数,再对 n!n!n! 分解质因数关于 n!n!n! 分解质因数的方法可以看我的上一篇博客 阶乘分解将n!n!n!分解为以下形式对于每一个分解出来的质因数,可以从000选到cicici,所以有ci+1ci+1ci+1种可能,所以约数个数为需要注意的是我们这里分解的是n!n!n!,而最终需要的是(n!)2(n!)^2(n!)2 ,所以对于每一次分解的cicici应该乘以222#include <bits/stdc++.h>using namespace原创 2021-05-12 23:05:12 · 207 阅读 · 0 评论 -
阶乘分解
题目:题解:以888举例8!8!8!中222的个数为:8/28/28/2=48/48/48/4=28/88/88/8=14+2+1=84+2+1=84+2+1=8之前我们找约数的时候是竖着来找,转化为横着来找,省去大量的时间#include <bits/stdc++.h>using namespace std;long long pri[1000005];long long primes[1000005];int con=0;void prime(long lon原创 2021-05-12 22:46:41 · 165 阅读 · 0 评论 -
质数距离
题目:题解:转化为筛出[l,r][l,r][l,r]区间内的质数因为对于每一个数nnn,都存在一个小于等于n\sqrt{n}n的约数首先求出223−1\sqrt{ 2^{23}-1}223−1 ≈\approx≈ 500005000050000,所以首先筛出500005000050000以内的素数,然后对于每一个质数pipipi,找到第一个大于等于lll的倍数ppp,并经行标记,注意最小是pipipi的两倍,之后没有被标记的点即为区间内的质数,最后循环遍历质数找到最大最小差值即可#in原创 2021-05-12 22:40:26 · 252 阅读 · 0 评论 -
越狱
题目:题解:首先算出所有排列的可能性ans1ans1ans1 = mnm^nmn%mod再算出不会越狱的情况ans2ans2ans2 = m∗(m−1)(n−1)m*(m-1)^{(n-1)}m∗(m−1)(n−1)%mod则 ansansans = (ans1−an2+mod)(ans1-an2+mod)(ans1−an2+mod) %mod (为了避免负数)#include <bits/stdc++.h>using namespace std;long long mod=1原创 2021-05-11 22:25:27 · 143 阅读 · 0 评论 -
轻拍牛头
题目:题解:暴力枚举约数会超时,我们把找a[i]a[i]a[i]有几个约数转化为a[i]a[i]a[i]是几个数的倍数首先数出a[i]a[i]a[i]的个数 con[a[i]]con[a[i]]con[a[i]]然后对于存在的con[a[i]]con[a[i]]con[a[i]]枚举倍数的个数,最后输出即可#include <bits/stdc++.h>using namespace std;long long a[100005];long long con[1000005];原创 2021-05-11 22:18:06 · 131 阅读 · 0 评论 -
香甜的黄油
题目:题解:枚举以每一个点作为起点的答案,使用迪杰斯特拉优化版本#include <bits/stdc++.h>using namespace std;const int N=2e5;int n,m,s;int e[N],w[N],ne[N],h[N],idx,dis[N],vis[N];int a[505];int inf=0x3f3f3f3f;typedef pair<int,int> pll;int add(int a,int b,int c){原创 2021-05-10 22:10:53 · 156 阅读 · 1 评论 -
牡牛和牝牛
题目:题解:以f[i]f[i]f[i] 表示有i只的时候的种数先考虑 iii <= k+1k+1k+1 的时候最多有一只牡牛,此时情况共有 i+1i+1i+1 种此外,只需要考虑最后一只是不是牡牛即可如果最后一只不是牡牛,表达式为f[i]=f[i−1]f[i] = f[i-1]f[i]=f[i−1]如果最后一只是牡牛,则从第i−ki-ki−k到i−1i-1i−1都不能为牡牛,表达式为f[i]=f[i−k−1]f[i] = f[i-k-1]f[i]=f[i−k−1]相加即为f[i]f[i原创 2021-05-10 20:11:58 · 399 阅读 · 0 评论 -
不要62
题目题目链接:题解:暴力模拟可解#include <bits/stdc++.h>using namespace std;long long dp[1000005];int main(){ long long n,m; for(int i=1;i<=1e6;i++) { long long k=i; while(k>0) { if(k%10==4||k%100==62) { dp[i]++; break; } k原创 2021-05-08 16:27:06 · 106 阅读 · 0 评论 -
计数问题(详解)
题目:题解:分情况统计例如要统计111的个数,可以统计111在每一位上的个数,然后相加此时要注意一种特殊情况,即要统计000的个数例如要统计000在第444位的个数的时候,应该注意,前三位不能都为000所以此时xxx<abcxxx < abcxxx<abc的时候取值范围变成了1<=xxx<abc1 <= xxx < abc1<=xxx<abc,所以此时ans+=(xxx−1)∗1000ans+=(xxx-1) * 1000ans+=(xx原创 2021-05-08 16:23:10 · 482 阅读 · 0 评论 -
夏洛克和他的女朋友
题目:题解:当i大于3的时候一定有 444 % 222 == 000#include <bits/stdc++.h>using namespace std;int pri[100005];int a[100005];void primes(){ for(long long i=1;i<=1e5;i++) pri[i]=1; pri[1]=0; for(long long i=2;i<=1e5;i++) { if(pr原创 2021-05-07 21:53:59 · 182 阅读 · 0 评论 -
哥德巴赫猜想
题目:题解:质数筛#include <bits/stdc++.h>using namespace std;int pri[1000005];void primes(){ for(long long i=1;i<=1e6;i++) pri[i]=1; pri[1]=0; for(long long i=2;i<=1e6;i++) { if(pri[i]) { for(int j=2;原创 2021-05-07 21:52:06 · 115 阅读 · 0 评论 -
Codeforces Round #719 (Div. 3) E. Arranging The Sheep
题目:题目链接:题解:yyy相同,xxx不同可以参考货舱选址问题,找到所有xxx的中位数,求到中位数的距离,但由于最后xxx不在同一个点,所以再减去xxx的相对坐标即可,即xxx - iii#include <bits/stdc++.h>using namespace std;int b[1000005];int main(){ int t; cin>>t; while(t--) { long long n; cin>>n; stri原创 2021-05-06 23:00:42 · 157 阅读 · 0 评论 -
Codeforces Round #719 (Div. 3) D. Same Differences
题目:题目链接题解:把题目稍微变形一下就可以变成 aaaiii - iii = aaajjj - jjj在输入的时候把数据处理为aaaiii = aaaiii - iii,然后计数这个数出现的次数cntcntcnt,对于此时的aaaiii而言,满足条件的次数为cntcntcnt * (cntcntcnt - 111) / 222,相加即为答案#include <bits/stdc++.h>using namespace std;map<long long ,long lon原创 2021-05-06 22:44:05 · 297 阅读 · 3 评论 -
程序自动分析
题目:题解:离散化加上并查集#include <bits/stdc++.h>using namespace std;const int N=2e5+10;int con;unordered_map<long long ,long long>s;int p[N];struct node { int x,y,e;}q[N];int find(int x){ if(p[x]!=x) p[x]=find(p[x]); return p[x];原创 2021-04-29 22:26:53 · 162 阅读 · 0 评论