数学
行走天涯的豆沙包
人生天地间,忽如远行客。
展开
-
CCPC威海站
这场整场都很迷,先是A题贡献6发罚时,然后L题读错题近1个小时。如果L题能读对的话说不定能节约很多时间想出分组背包,那么就可以解决时间给ar去过C题,说不定可以6题可以银的硬生生变成了铜尾。L题解:我们需要让分解出来的lcm最大那么就是一些互质的数或者是他们的次数幂,所以每一个幂次可以看成一组背包,那么我们就可以用分组背包。因为相同底数多选的话lcm就是计算最高的那个幂次,所以就是选不选,选的话就只选一组中的一个的分组背包问题。需要预处理log不然回T。#include<bits/stdc++.原创 2020-10-27 10:48:10 · 591 阅读 · 0 评论 -
矩阵乘法——OpenJ_POJ - C16H
题解:首先知道我们每一个球的扩散是只向四个方向扩散,所以我们新产生的贡献分成了两部分,一部分是复制一份移动四个方向,然后移动的时候在新的位置上加上坐标的净增长值就是这一次的坐标总和了。#include<bits/stdc++.h>#define int long longusing namespace std;const int N=2e4+10;int a[N],b[N];const int mod=1e9+7;struct Matrix{ long long a[2原创 2020-10-09 16:11:22 · 214 阅读 · 0 评论 -
树
题解:我们把树切割成多个连通块,每个连通块的颜色不同,分成多个连通块的方法就是切边。#include <bits/stdc++.h>#define int long longusing namespace std;typedef long long ll;const int mod=1e9+7;const int N=1e5+10;vector<int> g[N];int fac[N],inv[N];int qmi(int a,int b){ int r原创 2020-09-29 15:38:04 · 189 阅读 · 0 评论 -
Paint Box
题解:我们知道至少涂k种颜色并且相邻两个不相邻的方案数为:k(k−1)n−1k(k-1)^{n-1}k(k−1)n−1。然后容斥一下就可以了。#include<bits/stdc++.h>using namespace std;#define ll long longconst ll mod=1e9+7;const int maxn=1e6+10;int T;ll p[maxn], invp[maxn], inv[maxn];ll qp(ll a, ll b){ a %原创 2020-09-29 10:04:56 · 405 阅读 · 0 评论 -
E - Sequence in the Pocket
题解:我们直接排序,然后就可以知道最后结果是如何得。我们要保证操作得数最小,所以要保证更多得数在原位上面数更多的保持不变。所以扫一遍找出需要移动的位置。#include <bits/stdc++.h>//#define int long longusing namespace std;typedef long long ll;const int N=1e5+10;int a[N],b[N];void solve(){ int n; scanf("%d",&n);原创 2020-09-24 18:35:33 · 195 阅读 · 0 评论 -
2020.9.22训练
[Contest #16]小 C 的数论习题CRT板子题,但是题目中要求输出的是整数,所以res=0的时候我们输出232332333。#include <bits/stdc++.h>//#define int long longusing namespace std;const int N=1e5+10;int a[10],m[10],n=3;typedef long long ll;ll exgcd(ll a,ll b,ll &x,ll &y){ if原创 2020-09-22 10:30:28 · 129 阅读 · 0 评论 -
C. Square Subsets
题解:题目让找几个数的乘积是一个完全平方数,我们知道完全平方数的质因数分解之后的因子的指数都是偶数,70以内的素数只有10多个,所以选择用状压dp。我们状压的状态就是这些素数因子的指数是否为偶数。选择一个数的时候相当于把这个数的连续质因子指数加到另一个质因子的指数上面,当我们这个质因子的指数为偶数的时候那么加上偶数不影响当前的奇偶性,直接由上一个状态转移过来就行了。为奇数的时候就转移到亦或为0的状态。根据二项式定理我们知道,k个数里选1,3,5。。这样的奇数个的方案为2k−12^{k-1}2k−1,偶数的原创 2020-09-18 19:56:10 · 164 阅读 · 0 评论 -
D. Unusual Sequences
题解:看到和式的时候就想到了插板法,然后我们需要剔除因子为gcd的倍数的情况,就比如我们在隔板(3,3,3,3)的时候算方案为232^323已经把(6,6)这种情况算了,但是这个是不满足的。所以我们在筛m的因子时候特判一下是否有因子能够整除n,如果能就需要减去。#include <bits/stdc++.h>#define int long longusing namespace std;const int mod=1e9+7;const int N=1e5+10;int f[N]原创 2020-09-17 19:57:15 · 188 阅读 · 0 评论 -
C. Minimum Sum
题解:定义每个数的权值为出现的次数乘上位数上的权值,比如十位就乘以10。#include <bits/stdc++.h>//#define int long longusing namespace std;int a[100],lead[1000],vis[100],b[100];char s[1000];int qmi(int a,int b){ int res=1; while(b){ if(b&1) res=res*a;原创 2020-09-17 11:47:19 · 288 阅读 · 0 评论 -
D. Inversion Counting
题解:我们假设一个逆转[l,r]这个区间,那么对于[1,l-1],[r+1,n]这里面的数他们逆序数是没有影响的。那么对于我们[l,r]区间的里面数,对于一个数的逆序数是a,那么逆转过后逆序数就变成了(r-l+1)(r-l)/2-a然后我们再减去一个a,2a是不影响奇偶性的,所以我们判断一下前面的奇偶性就好了。#include <bits/stdc++.h>using namespace std;//#define int long longconst int N=2e3+10;i原创 2020-09-08 22:41:30 · 168 阅读 · 0 评论 -
B. Jamie and Binary Sequence (changed after round)
题解:我们先把这个值按照二进制进行分解过后统计有多少项,如果大于k的话那么代表k不够用。否则我们先遍历高位,因为要让高位的系数尽可能的高,所以先把能转换到合法位置的全部转换过来,然后要让字典序最大,所以我们尽量让地位减1去补齐k,尽量不动高位。因为中途可能补齐低位的时候低位开始不满足但是被高位传过来贡献后又满足了,所以需要扫描一下前两个位置。#include <bits/stdc++.h>using namespace std;#define int long longconst in原创 2020-09-08 16:45:12 · 164 阅读 · 0 评论 -
A. The Monster
题解:我们知道从左边往右边扫的时候如果左括号+?小于)那么一定会有)失衡无法匹配,右边扫过来同理。#include <bits/stdc++.h>using namespace std;#define LL long longconst int N=5010;//LL p,k,cnt=0,ans[100000];int ok[N][N];void solve(){ string s; cin>>s; for(int i=0;i<s.length原创 2020-09-08 14:22:01 · 136 阅读 · 0 评论 -
D. Fafa and Ancient Alphabet
题解:我们可以推出公式pi∗pi−1p_i*p_{i-1}pi∗pi−1这个公式累加起来,直到我们遇见两个字符串的第i个位置是两个字母都是确定的时候,pip_ipi代表的是当前a字母大于b字母的概率乘以前面字母都相同的概率。#include <bits/stdc++.h>using namespace std;#define int long longconst int mod=1e9+7;typedef long long ll;const int N = 1e5+10;原创 2020-09-08 08:28:10 · 148 阅读 · 0 评论 -
A. Save Energy!
题解:考虑周期类问题就需要先把周期找到,在这里一个周期就是炉子打开到关上所用的时间。所以一个周期就是ceil(k/d)*d的时间。#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N = 2010, M = 4000010;void solve(){ ll k,d,t,T; scanf("%lld%lld%lld",&k,&d,&t);原创 2020-09-07 15:16:03 · 210 阅读 · 0 评论 -
A. Finite or not?
A. Finite or not?题解:一个分数在x进制下如果不是无限小数,那么分母一定能没该进制的一些因子整除。#include <bits/stdc++.h>#define int long longusing namespace std;typedef long long ll;const int N=2e5+10;ll a[N];void solve(){ ll p,q,b; scanf("%lld%lld%lld",&p,&q,&b)原创 2020-09-01 20:44:06 · 147 阅读 · 0 评论 -
E. Bus Number——排列组合
E. Bus Number题解:多重集,我们先把所有方案排列出来也就是不管前导零的方案数,然后将一个0固定在开头,其他0随便插空,把这个方案数减去最后就是答案。#include <bits/stdc++.h>#define int long longusing namespace std;typedef long long ll;int num[10],tempNum[10],a[10];ll jc[20],ans=0; void dfs(int x){ if(x==原创 2020-09-01 13:54:47 · 700 阅读 · 0 评论 -
第二类斯特林数——CF1278F Cards
题解:主要考察把幂次和写成第二类斯特林数的形式。#include <bits/stdc++.h>//#define int long longusing namespace std;typedef long long ll;const int N=5005;ll s[5005][5005],n,m,k;const int mod=998244353;ll q_pow(ll a,ll b){ ll res=1; while(b){ if(b&a原创 2020-08-15 21:59:11 · 910 阅读 · 0 评论 -
期望——Vasya and Magic Matrix
题解:对于当前点来说,权值比他小的每一点都是等概率的。所以对当前点的权值进行从小到大排序,然后概率dp,状态转移的方程很好就求出来了。#include <bits/stdc++.h>//#define int long longusing namespace std;using namespace std;const int N=10000010;int n, m, sumx, sumy, sump, dp[N], sumdp, x, y, tot;struct point {原创 2020-08-14 22:18:24 · 166 阅读 · 0 评论 -
期望——FAVDICE - Favorite Dice
题解:假设当前已经丢除了i个面了,下一个面是新的概率是n−i/nn-i/nn−i/n我们知道概率的倒数是期望所以求和就行了。#include <bits/stdc++.h>#define int long longusing namespace std;using namespace std;const int N=10000010;int n,t;double ans;signed main(){ cin>>t; while(t--){原创 2020-08-14 22:06:08 · 152 阅读 · 0 评论 -
期望——P6154 游走
题解:我们相当于寻找走到每个点的长度的期望,对于每个点对总期望的贡献就是能走到这个点的次数乘以走到这个点的总长度。#include <bits/stdc++.h>#define int long longusing namespace std;const int mod=998244353;const int N=1e5+10;int q_pow(int a,int b){ int res=1; while(b){ if(b&1) res=原创 2020-08-14 19:24:55 · 131 阅读 · 0 评论 -
LOJ——1318
题解:我们有m=0的时候可以生成多少中串就能有几对,所以摸n的时候下标是0-n-1所以加一个1就行了,k=1,m!=0的时候先手组合不出想要的答案所以直接输,其他情况就是我们l个位置可以有k中选择,m个位置有k-1种选择,所以组合数学一下,因为存在重复(AB,BA)这种情况所以除以2,但是n和2不一定互质,所以不能直接除以2。#include<bits/stdc++.h>using namespace std;typedef long long LL;int vis[100010];原创 2020-08-12 15:52:44 · 129 阅读 · 0 评论 -
Loj——1299
题解:我们知道当前位置如果是D的话那么就可以理解为这个位置的字母(当前位置的数)往前放,U的话就是往后面放。所以我们的转移方程就是。fi,jf_{i,j}fi,j代表处理到第i个位置手上有j个U没有处理。1)当前字母为D,则f[i][j]=f[i−1][j]∗jf[i][j]=f[i-1][j]*jf[i][j]=f[i−1][j]∗j(在前面找一个没有安排U的位置(也就是空位)将这个D放下)f[i][j]=f[i−1][j+1]∗(j+1)∗(j+1)f[i][j]=f[i-1][j+1]*(j+原创 2020-08-09 22:42:26 · 124 阅读 · 0 评论 -
LightOJ - 1246
题解:第二类斯特林数我们可以把一个大矩形分成两个小矩形,就想国际象棋的棋盘一样,黑色的在一起白色在一起,这样的话我们在同一个矩形里的任意两个格子之间的曼哈顿距离一定是偶数,所以就变成了,我们从k个颜色里面选i个颜色放第一个矩形里面,从k-i个颜色里面选j个颜色放第二个矩形里面,这样就变成了第二类斯特林数,把n个两两不同的颜色放入k个无差别的非空子集里面(有差别的话乘以一个1/k!1/k!1/k!)最后就是答案了。#include <bits/stdc++.h>using namespace原创 2020-08-09 19:56:28 · 117 阅读 · 0 评论 -
Light OJ-1226
题解:最后一个位置肯定是第i个任务的子任务,其他子任务利用插空法放在前面sum-1个空位里面。#include <bits/stdc++.h>#define LL long long#define MMF(x) memset((x),0,sizeof(x))#define MMI(x) memset((x), INF, sizeof(x))using namespace std;const int INF = 0x3f3f3f3f;const int N = 1e5+20;co原创 2020-08-09 16:24:20 · 150 阅读 · 0 评论 -
LightOJ - 1116
题解:求最小的偶数,并且保证我们的m是奇数,我们唯一分解可以知道,当我们2这个因子全部提出来过后,组成n这个数的因子就只有奇质数的因子了。#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;typedef long long ll;const int N=1e5+10;int pri[N],tot,v原创 2020-07-29 21:38:00 · 195 阅读 · 1 评论 -
LOJ——1008
题解:我们可以知道n*n==x的时候,我们讨论n的奇偶性,我们可以看到奇数在左边,偶数在右边,然后对角线的元素就是(x+1)*x+1。我们知道开方后奇数是顺时针,偶数是逆时针。所以这样就可以判断了。#include <bits/stdc++.h>using namespace std;typedef long long ll;signed main(){ int t; scanf("%d",&t); int Cas=1; while(t--){原创 2020-07-28 01:22:29 · 154 阅读 · 0 评论 -
2020牛客暑假多校第四场
H题题解:挂一下原题的链接原题网上题解很详细了。代码和网上题解思路一样。#include <bits/stdc++.h>using namespace std;typedef long long ll;const int maxn = 2e5 + 10;//int nxt[maxn][10],fa[maxn],len[maxn],cnt[maxn],pos[maxn];//int last = 1,tot = 1;//void insert(int x){// int原创 2020-07-20 20:59:22 · 204 阅读 · 0 评论 -
贪心——Phoenix and Science
传送门题解:首先我们观察如果一直增长的话那么就是1,2,4,8…显然就是和二进制有关,这样的数一定可以拼凑出任何数,所以这道题也一定是有解的。所以,我们首先通过贪心一直增长的到接近的n,然后我们如果想找到每天分裂多少个细胞的话,我们可以这么想,如果我们分裂了相当于我们分裂了一个质量为0的细胞和一个质量为1的细胞(因为只用关心总重量),然后我们就知道了后一天比前一天多出来的质量也就是0质量的细胞变成1质量的细胞,所以后一天的质量减去前一天的质量也就是前一天的细胞分裂数。#include <bits原创 2020-05-12 20:16:10 · 134 阅读 · 0 评论 -
牛客算法周周练5
小雨坐地铁题解:采用分层图跑最短路。#include<bits/stdc++.h>using namespace std;#define mp make_pair#define ll long long#define INF 0x3f3f3f3fconst int N = 1e6+100;int n, m, s, t;int ne[N<<1],head[N...原创 2020-05-05 20:58:49 · 177 阅读 · 0 评论 -
排列组合|DP——树
传送门题解以DP的思路去理解的话就是,当一条dfs序上面的,子节点的父节点肯定已经涂过颜色了,而对于他的兄弟节点来说可能涂了也可能没有涂。所以对于当前结点的涂色就是涂和父节点一样的颜色或者不一样的颜色。那么状态转移方程式很容易就知道是f(i,j)=f(i−1,j)+f(i−1,j−1)∗(k−j+1)f(i,j)=f(i-1,j)+f(i-1,j-1)*(k-j+1)f(i,j)=f(i−1,j...原创 2020-05-05 17:18:18 · 477 阅读 · 0 评论 -
FFT——[ZJOI2014]力
题目链接题解:我们通过移向后,再将后面的式子翻转一下,就可以看到两个式子都是卷积的形式了。然后FFT套一下板子就过了。#include <bits/stdc++.h>using namespace std;inline int read(){ int x=0,f=1;char ch=getchar(); while (!isdigit(ch)){if (ch=...原创 2020-04-10 18:04:14 · 94 阅读 · 0 评论 -
莫比乌斯反演——[SDOI2015]约数个数和
题目链接题解:这道题的关键就是这个式子带进去化简完了后的答案原创 2020-04-09 16:26:23 · 122 阅读 · 0 评论 -
莫比乌斯反演——Crash的数字表格
题目链接题解:把lca拆分成gcd的形式,然后接下来都是套路利用分块来完成O(n)求和。#include <bits/stdc++.h>#define N 10000010#define mod 20101009using namespace std;typedef long long ll;const int n = 10000000;int mu[N] , pri...原创 2020-04-09 11:54:46 · 119 阅读 · 0 评论 -
莫比乌斯反演——[HAOI2011]Problem b
题目链接题解:列出式子是一个很明显的莫比乌斯反演,然后再加上容斥就可以很快过了。#include <bits/stdc++.h>#define int long longusing namespace std;typedef long long ll;const int N=5e5+5;const int MOD=1e9+7;int a,b,c,d,k;int pr...原创 2020-04-08 20:04:33 · 117 阅读 · 0 评论 -
组合数学——[Shoi2015]超能粒子炮·改
题目链接题解:一看n,k如此的大就知道要使用卢卡斯定理了。利用卢卡斯定理化简以后我们可以得到以mod为分界线,分成多块,最后提取公因式,这里分块的时候,最后可能会剩余一块不完整的系,我们通过分块后知道预处理出2333的所有组合数就行了。其他的和式部分大区间利用递归,小区间直接用预处理的答案得到。#include <bits/stdc++.h>#define int long l...原创 2020-04-08 18:04:36 · 171 阅读 · 0 评论 -
莫比乌斯函数——[中山市选2011]完全平方数
题目链接题解:让我们找到第k个没有平方因子的数,那么等价于u(i)!=0u(i)!=0u(i)!=0,首先这个是具有单调性的所以可以二分。然后根据容斥原理求出区间内有多少个没有平方因子的数。#include <bits/stdc++.h>#define int long longusing namespace std;typedef long long ll;const ...原创 2020-04-08 09:32:05 · 147 阅读 · 0 评论 -
数论——Longge's problem
题目链接题解:因为我们(i,n)(i,n)(i,n)一定是n的因数,所以我们枚举到根号n就行了,并且枚举的是n的因子,复杂度肯定可以过去。最后也就是这个公式的答案。#include <stdio.h>#include <math.h>using namespace std;typedef long long ll;const int mod=1e6+3;...原创 2020-04-07 17:10:27 · 162 阅读 · 0 评论 -
组合数学——序列统计
题目链接题解:生成一个长度为1-N的序列,在l,r区间中选择数字。那么有m=r-l+1个数字可以选择,每个数字选择的次数加起来为N,所以这是明显的插空法。为了让每个数字都一定会被选一次,所以左右全部+1,接下里就是利用公式合并再卢卡斯一下了。#pragma GCC optimize(2)#include <bits/stdc++.h>#define int long long...原创 2020-04-07 13:21:58 · 502 阅读 · 0 评论 -
数论——Special Prime
题目链接题解:没写出来,看了题解豁然开朗。我们先化简式子得到n2∗(n+p)=m3n^2*(n+p)=m^3n2∗(n+p)=m3假设n和p不互质,则n=k∗pn=k*pn=k∗p带入式子可以得到p3∗(k3+k2)=m3p^3*(k^3+k^2)=m^3p3∗(k3+k2)=m3显然开三方过后(k3+k2)(k^3+k^2)(k3+k2)不是一个整数,所以假设不成立,n于p互质。然后我们令...原创 2020-04-06 21:50:24 · 136 阅读 · 0 评论 -
除法分块——[CQOI2007]
题目链接#pragma GCC optimize(2)#include <bits/stdc++.h>using namespace std;typedef long long ll;int main (){ int n,k; scanf("%d%d",&n,&k); ll res=1LL*n*k; for(ll l=1,r;l<...原创 2020-04-06 19:08:13 · 103 阅读 · 0 评论