数论
悭吝韶华
在学习Unity和图形学.
展开
-
牛客多校2020第二场F Fake Maxpooling(互质数对筛矩阵)
关于矩阵初始值我们可以用互质数对进行筛选,复杂度大致为N*M.初始完值后,用二维单调队列维护矩阵最大值即可。代码如下#include <bits/stdc++.h>using namespace std;#define MAXN 5050#define ll long longint n,m,k;int a[MAXN][MAXN];int mx[MAXN][MAXN];#define fore(l,r) for(int i=(l);i<=r;i++)int main(原创 2020-07-15 17:23:45 · 109 阅读 · 0 评论 -
[典藏题记003]Codeforces Round #601 (Div. 2)E2. Send Boxes to Alice (Hard Version)⭐⭐⭐⭐
首先考虑可能的k值。k首先不能为1,且是素数。如果∑i=1na[i]\sum_{i=1}^{n}{a[i]}∑i=1na[i]为素数,显然只能堆积到一个点上,只能为一堆。sumsumsum的范围为1e12,枚举每个质因数即可,做法是质因数分解。所以枚举sum的所有质因数即可。再来看下怎么求:记录下a数组的前缀和。对于位置i位置i位置i,如果sumi∤ksum_i\nmid ksumi∤k,只能把sumi%ksum_i\%ksumi%k个糖果往后推,或着从后面拿k−sumi%kk-sum_原创 2020-07-09 19:38:58 · 100 阅读 · 0 评论 -
Codeforces Round #554 (Div. 2)C. Neko does Maths(gcd)
传送门这题用到了一个性质就是gcd(a,b)=gcd(a-b,b)对于a>=b。lcm(a+k,b+k)=(a+k)∗(b+k)/gcd(a+k,b+k)lcm(a+k,b+k)=(a+k)*(b+k)/gcd(a+k,b+k)lcm(a+k,b+k)=(a+k)∗(b+k)/gcd(a+k,b+k)根据前面的性质可以得到:gcd(a+k,b+k)=gcd(a−b,b+k)gcd(a+k,b+k)=gcd(a-b,b+k)gcd(a+k,b+k)=gcd(a−b,b+k)显然我们希望gcd(原创 2020-07-07 00:10:30 · 107 阅读 · 1 评论 -
Aladdin and the Flying Carpet(算数基本定理+埃式筛法)
这里用到了质因数分解求因子个数。预处理用埃式筛法打了个素数表。对于小于b的因子暴力跑,没想到别的方法。#include<bits/stdc++.h>using namespace std;int n,m;#define MAXN 1005000#define ll long longll a[MAXN];ll p[MAXN];int check[MAXN];int pcnt=0;void isprime(){ for(ll i=2;i<=1000000;i原创 2020-07-06 22:25:26 · 124 阅读 · 0 评论 -
Codeforces Round #586 (Div. 1 + Div. 2)D. Alex and Julian(数的基)
传送门题意就是给你n个数,然后和一个有无限个点组成的图,如果图中abs(i−j)abs(i-j)abs(i−j)在这n个数中,则可以建立这条边。要求最小删去多少个给定的数,使得该图是二分图。二分图有一个最基本的性质就是不存在奇数环。考虑如果存在环,从一个点x开始再回到x,如果边数不为奇数,那么现有的数都要满足一个性质:即二进制上的最低位(最小的那位)要相同,如此可保证不存在奇数环。遍历一遍找出每个数的最低位,然后找到计数最多的那一个二进制位,不对应-该二进制位-的都删去即可。#include&原创 2020-07-04 22:31:40 · 103 阅读 · 0 评论 -
[典藏题记001]D. Frog Jumping(数论+图论+思维+暴力)
题目传送门写这题脑细胞快死完了,看了大佬的题解又研究了半天。简单讲一下我的做法:这题可以小范围暴力,大范围找出规律。设h(i)为要到达点i的最小x设h(i)为要到达点i的最小x设h(i)为要到达点i的最小x。那么ans=ans=ans=∑i=0n(n−h(i)+1)(如果点i可以到达)\sum\limits_{i=0}^{n}{(n-h(i)+1)}(如果点i可以到达)i=0∑n(n−h(i)+1)(如果点i可以到达)然后有一个性质就是:如果点i可达,那么一定满足:i∣gcd(a,b)i|g原创 2020-07-03 21:04:52 · 253 阅读 · 0 评论 -
Dasha Code Championship - SPb Finals Round(C. Kamil and Making a Stream)(树上gcd的传递)
最关键的性质是一个节点的值往下传递,最多只会改变log1e12log1e12log1e12次,约等于40.这表明向下搜索的过程中,传递到每个节点的不同值的个数不会超过40。#include<bits/stdc++.h>using namespace std;#define fore(i, l, r) for(int i = int(l); i < int(r); i++)#define MAXN 100005#define ll long longint n;ll a[原创 2020-07-01 17:23:44 · 139 阅读 · 0 评论 -
Codeforces Round #632 (Div. 2) F. Kate and imperfection详细题解(数论+思维)
首先我们要统计出1~n以内素数的个数cnt。如果k<=cnt,显然所有素数都互质,Maxgcd(ai,aj)Max_{gcd(ai,aj)}Maxgcd(ai,aj)=1.接下来k>cnt,我们要怎么考虑呢?首先如果你加入一个x,那么为了使得产生的gcd尽可能小,x的每一个因子(不包括它本身)必然已经在集合里了,那么x的加入对答案的贡献就是x的因数中小于x并且最大的那一个。素数对答案的贡献为1,合数对答案的贡献为小于它本身的它自己的最大因数。显然一个合数的因数对答案的贡献一定小于该合原创 2020-05-31 17:34:48 · 116 阅读 · 0 评论 -
Educational Codeforces Round 88 (Rated for Div. 2)E. Modular Stability详细题解(组合数学+数论)
n<k的话,无解输出0.下面考虑n>=k的情况.首先,这道题,我想的是只要aia_{i}ai中有一个1,那么显然其他的aia_{i}ai都可以任意选择了,但是这样漏了情况。我又想到了二进制,对于每一个2i2^i2i取模,显然打乱顺序不影响答案。当然这样也不行,过不了样例。又想了一会,发现当且仅当对于任意iii都满足(aia_{i}ai%a1a_{1}a1==0)这样一种情况时,无论怎么打乱都不会影响取模后的结果。那怎么证明这个结论的正确性呢?假设存在i>1(aia_{i}原创 2020-05-31 10:40:29 · 161 阅读 · 1 评论