数论
算法
风萧萧兮易水寒丶
985软件工程本科在读
展开
-
Codeforces Yet Another Counting Problem(数学)
题意:[l,r]范围内多少个数满足 (x % b) % a != (x % a) % b。思路:打表找规律小心数据范围代码:#include <bits/stdc++.h>#define ll long long#define Max 0x3f3f3f3f3f3f3f3fusing namespace std;int cnt[1000000];int main(...原创 2020-04-29 18:35:36 · 286 阅读 · 0 评论 -
Codeforces Primes and Multiplication(数论)
解题思路:看懂g函数就好搞了就是再问你 45 里面3作为质因子 出现次数是多少我们考虑f 无非就是分解质因数 最多20个然后 1 到 n 这个质因数出现了几次 套阶乘的分解质因子就好然后 注意 阶乘质因子就不要乘了 连long long 都炸注意理解题目意思就好了,和之前那道阶乘的题目很类似注意精度,小心溢出#include <bits/stdc++.h>#defi...原创 2020-04-26 21:11:04 · 107 阅读 · 0 评论 -
Codeforces Pride(数论)
题目大意:给你n个数,让你进行操作,操作是对两个数取他们的gcd,这个gcd可以将这两个数其中一个替换掉,问将所有的数字变为1最少需要多少次操作解题思路:我们应该找能gcd得出1的最小区间,得出他们的距离,这个距离就是将这个小区间变出一个1所需要的步数,只要能得出一个1,再需要n-1步就可以将整个区间变为1了代码:#include <bits/stdc++.h>using...原创 2020-04-26 11:20:31 · 223 阅读 · 0 评论 -
Codeforces Colorful Bricks(组合数)
题目大意:给你n个块,m种颜色,让你涂颜色,要求最后相邻砖块颜色不同的情况总数为k,问你有多少种图法解题思路:n个砖块间总共有n-1个间隔,从n-1个间隔中选出k个间隔,这k个间隔相邻的两端砖块颜色不同,其他间隔两端砖块颜色相同,可以看成是给k+1个砖块涂颜色,相邻砖块颜色互不相同#include <bits/stdc++.h>using namespace std;#d...原创 2020-04-25 19:12:00 · 149 阅读 · 0 评论 -
Codeforces Taxes(数论)
解题思路:代码:#include <bits/stdc++.h>using namespace std;int n,ans;bool judge(int x){ for(int i=2;i*i<=x;++i) if(x%i==0) return false; return true;}int main(){ scanf...原创 2020-04-24 15:26:54 · 142 阅读 · 0 评论 -
武大Shopee杯-B
题目大意:给定n个数,从n个数中选出两个数之和为0,为一种匹配方式,每个数不能与本身匹配,问总共可能的匹配数目。解题思路:由于数的范围不大,求出每个数出现的次数,则i+j==0,匹配方法为cnt[i]*cnt[j]种,注意0与0匹配的时候比较特殊。#include <bits/stdc++.h>#define ll long longusing namespace st...原创 2020-04-12 23:12:07 · 132 阅读 · 0 评论 -
数学考试(前缀和)
解题思路:先求出前缀和,然后求出遍历求出坐标i后长度为k的区间的最大值,最后求出最大的pre[i+k-1]-pre[i-1]+m[i],时间复杂度为O(N*T)代码:#include<bits/stdc++.h>using namespace std;#define ll long longconst int maxn=2e5+10;int t,n,k;ll pre...原创 2020-03-27 10:38:50 · 131 阅读 · 0 评论 -
仓库选址(前缀和、数学)
解题思路:二维前缀和(O(NM))这个算法可能比较简单易懂,二维前缀和的实现与计算就不再赘述了,可以上网查一下在暴力方法一中每次枚举一个坐标都要把到所有点的距离重新算一遍,其实没必要。若仓库在点 (x,y) 处,现在将仓库移动到点 (x+1,y) ,那么对于左上角为(1,1),右下角为(x,m)的矩阵,所有点到达仓库的距离都+1,对于左上角为(x+1,1),右下角为(n,m)的矩阵,所有...原创 2020-03-25 16:30:55 · 537 阅读 · 0 评论 -
阶乘(数论)
#include<bits/stdc++.h>using namespace std;int primer[10000],cnt[10000],ans,n,c;inline bool judge(int x){ for(int i=0;i<c;++i) { int temp=x,k=0; while(temp) { k+=temp/prime...原创 2020-03-23 17:06:45 · 224 阅读 · 0 评论 -
(模板)有理数取余
思路:求c=(a/b) mod p 相当于求a*b^-1modp,先求出b相对于p的逆元,就可以求出结果。#include<bits/stdc++.h>using namespace std;#define ll long long#define mod 19260817ll a,b;void read(ll& x){ x=0; int f=1; cha...原创 2020-03-17 16:58:12 · 178 阅读 · 0 评论 -
(模板)乘法逆元
代码:ll f(ll base,ll n,ll p){ ll ans=1; while(n>0) { if(n&1) { ans*=base; ans%=p; } base*=base; base%=p; n>>=1; } return ans;}代码:ll ive[3000030];int main()...原创 2020-03-16 17:34:32 · 309 阅读 · 0 评论 -
洛谷—P1313 计算系数(组合数、快速幂)
杨辉三角与组合数#include<bits/stdc++.h>using namespace std;const int mod=10007;long arr[1010][1010],a,b,k,n,m;long fastexp(long long base,long long n){ long long ans=1; while(n>0) { if(1&...原创 2020-02-26 20:22:07 · 139 阅读 · 0 评论 -
洛谷—P5686 和积和(前缀和)
解题思路:50分代码:时间复杂度O(n^3)#include<iostream>#include<algorithm>#include<stdio.h>#include<cstring>#include<queue>#include<vector>#include<iostream>#inc...原创 2020-02-20 15:52:13 · 178 阅读 · 0 评论 -
线性筛选质数
如下是一般的筛法(埃氏筛)://生成不大于 n 的所有质数bool numlist[100000001];int prime[20000001], cnt;void work(int n){ for(int i=2; i<=n; i++){ if(numlist[i]==false){ prime[++cnt] = i ; ...原创 2020-02-12 17:00:45 · 267 阅读 · 0 评论 -
快速幂||取余运算(模板)
int quickPower(int a, int b)//是求a的b次方{ int ans = 1, base = a;//ans为答案,base为a^(2^n) while(b > 0)//b是一个变化的二进制数,如果还没有用完 { if(b & 1)//&是位运算,b&1表示b在二进制下最后一位是不是1,如果是:...原创 2020-02-11 14:25:12 · 202 阅读 · 0 评论 -
洛谷—P1045 麦森数(高精度)
这道题可以分为两个模块,第一个模块为求的位数,第二个模块为求的后500位(不足补零)。我们主要来解决第一个模块:一、求位数首先我们知道 与 有着相同的位数,因为2的次方满足了最后一位不为零的要求,所以减一后位数并不会改变,那么我们可以直接求 的位数。那么怎么求位数呢?我们不妨设 ,根据 的位数为 ,我们只要想办法把 中的底数2改为10,指数加一就是位数了。由此想到用10的几次方...原创 2020-02-07 12:27:59 · 190 阅读 · 0 评论 -
筛选法求素数
https://blog.csdn.net/stack_queue/articlehttps://blog.csdn.net/stack_queue/article/details/53560887/details/53560887转载 2020-01-21 12:49:39 · 165 阅读 · 0 评论 -
大数加法计算
输入两个整数a和b,输出这两个整数的和。a和b都不超过100位。算法描述由于a和b都比较大,所以不能直接使用语言中的标准数据类型来存储。对于这种问题,一般使用数组来处理。定义一个数组A,A[0]用于存储a的个位,A[1]用于存储a的十位,依此类推。同样可以用一个数组B来存储b。计算c = a + b的时候,首先将A[0]与B[0]相加,如果有进位产生,则把进位(即和的十位数)存入r...原创 2020-01-20 14:44:32 · 188 阅读 · 0 评论 -
阶乘计算 大数计算
输入一个正整数n,输出n!的值。其中n!=123*…*n。算法描述n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。首先将a设为1,然后乘2,乘3,当乘到n时,即得到了n!的值。#include<io...原创 2020-01-20 13:15:37 · 128 阅读 · 0 评论