
Now coder
穷源溯流
路很长,尽管走便是。
-
原创 牛客练习赛77 小G的约数(整除分块)
ll go(ll n){ return n*(n+1)/2;}ll G(int n){ ll ans=0; for(ll l=1,r;l<=n;l=r+1){ r=n/(n/l); ans+=(go(r)-go(l-1))*(n/l); } return ans;}int main(){ while(~sd(n)){ pll(G(G(n))); }}2021-02-26 23:24:2417
0
-
原创 牛客练习赛77 小G的GCD(差分)
观察样例 2 ,可以发现答案为 (3+3+3),对于 k 的倍数:ak,其贡献到 (a+1)k 位置时改变,不由得想到差分的性质const int N=1e6+5; int n,m; int i,j,k; ll a[N];int main(){ while(~sdd(n,k)){ for(int i=k;i<=n;i+=k) a[i]=i; ll ans=0; for(int i=1;i<=n;i++) a[i]+=a[i-1]...2021-02-26 22:28:554
0
-
原创 第 45 届国际大学生程序设计竞赛(ICPC)亚洲网上区域赛模拟赛 Easy Equation(差分)
const int N=3e6+5; int n,m; int i,j,k; ll g[N],f[N];int main(){ int a,b,c,d; while(~sdd(a,b)){ sdd(c,d); for(int i=0;i<=a;i++) g[i]++,g[i+b+1]--; for(int i=1;i<=a+b;i++) g[i]+=g[i-1]; //i 为 x+y 的方案数 for(int i=0;i<=...2021-02-25 22:52:189
0
-
原创 牛客练习赛76 CG的通关秘籍(组合数学)
首先暴力解决时枚举 1~n 的全排列,共种方法,现在确定第一个数,而第一个数并不产生贡献设第一个数为 x,那么第二个数产生贡献的情况有两种,要么 y∈ [1,x-1] 产生 2 点贡献,要么 y ∈ [x+1,m] 产生 1 点贡献现在确定 x,y,由于全排列的性质,总共产生贡献为,其值为这样 x,y 确定下来,目前只剩下种排列方法,而每一位的总贡献为,共 n-1 位产生(除 x)所以答案为ll pow_mod(ll a,ll x){ ll ans=1;...2021-02-25 21:34:027
0
-
原创 第八届“图灵杯”NEUQ-ACM程序设计竞赛个人赛 小宝的幸运数组(同余定理)
如果预处理前缀和,题目依然是的复杂度,所以采用其他的方法当时还想了一个二分的算法,但是二分必须满足单调性,但此题不满足在一个数列中 (a+b+c+d)%mod=k 其中 (a+b)%mod=k,那么 (c+d)%k=0,所以记录第一个 k 的位置,寻找之后的位置与其的最大值即可const int N=1e5+5; int n,m; int i,j,k; ll a[N];int main(){ //IOS; rush(){ ...2021-01-30 22:32:5238
0
-
原创 第八届“图灵杯”NEUQ-ACM程序设计竞赛个人赛 建立火车站(二分)
题目描述新冠疫情,导致了各个城市之间物资输送的障碍。假设有N个城市在一条直线上,为了物资能顺利抵达各个城市,可以在路线上建立最多个数为K个暂时停靠站,由于火车在两个站台(城市也算站台)之间的距离越近,需要的总花费越少,因此我们需要让火车相邻两个站台之间的最大距离最小,求出距离L,2 ≤N ≤100000, 0 ≤K ≤100000,所有城市坐标小于等于10^12,且不存在负值。提醒: 城市坐标均为正整数,且停靠站只能建在整数坐标点上。输入描述:第一行输入城市个数N,可建立停靠站个数K.2021-01-30 21:22:0943
0
-
原创 第八届“图灵杯”NEUQ-ACM程序设计竞赛个人赛 黑洞密码
const int N=1e5+5; int n,m; int i,j,k; int a[N]; char ch[N];int main(){ IOS; string s; cin>>s; char str[500][2]; for(int i=0;i<26;i++) str['a'+i][0]='a'+i; for(int i=0;i<25;i++) str['a'+i+26][0]='...2021-01-30 21:19:4937
0
-
原创 牛客练习赛66 C.公因子(数论)
题目用到了一个 gcd 的推论,和 CF 的题目类似 :BLOG求出 gcd 之后,要求出 x 的值,k*gcd=a[1]+x -> k*gcd-a[1]>=0,求解 k 的值带入原式求出 x 即可const int N=1e6+5; int n,m; int i,j,k; ll a[N]; signed main(){ //IOS; while(~sd(n)){ for(int i=1;i<=n...2021-01-24 13:56:2822
0
-
原创 NC15203 投票统计(离散化)
其实这个题用 map 的话很好解决本题采用离散化解决,利用桶排的思想,因为桶无法申请那么大的内存,所以进行离散化const int N=1e5+5; int i,j,k; int n,m,t; pii a[N],cnt[N]; vector<int> v,ans;int get_id(int x){ return lower_bound(v.begin(),v.end(),x)-v.begin()+1;}bool ...2020-11-22 15:47:3241
0
-
原创 2020 ICPC Data Structure Problem(前缀和+线段树)
给出 2n 个数分别代表 a b 两个数组,题目要求维护数 c,c 是由 a,b 递推过来的题目的难点在于如何将单点修改转化到区间上来,我们可以枚举一下 ci 来寻找规律c1=max( a1,b1 ) c2=max( a2,max(b1+b2,a1+b2) ) c3=max( a3,max(a2+b3,max(b1+b2+b3,a1+b2+b3) ) ) 由此可以得出#define inf (1e18+1ll)const int N=2e5+5;...2020-11-19 22:29:5132
0
-
原创 2020 ICPC Knapsack(超大 01 背包)
如果按照正常解法求解 01 背包问题,一定会超时,先按照性价比选择,减少背包的容量,这样再用一次 01 背包解决问题即可const int N=2e5+5; int i,j,k; int n,m,t; ll dp[100+5]; struct Node { ll w,v; }a[N];bool cmp(Node a,Node b){ return a.v*b.w>a.w*b.v; }in...2020-11-19 14:41:4134
0
-
原创 2020 ICPC 2020(二分)
给出一个长度为 n 的字符串,统计 {si,sj,su,sv}=2020 的数量,并且 i<j<u<v ,如果一个字符被统计过,那么它不能再次被统计知道题目考察二分之后其实并没有那么难,二分枚举答案 ans,但是要考虑如何构成 2020 才能 ans 个,我们可以按位考虑,必须有第一个2 后面的 0 才有效,有 ans 个 2 后,第二个 2 才开始计数const int N=1e5+5; int i,j,k; int n,m,t; i...2020-11-19 13:56:11126
0
-
原创 2020 ICPC Determinant(计算行列式)
按照题目要求计算行列式 M对行列式进行消元,换成下三角行列式即可const int N=1e5+5; int i,j,k; int n,m,t; ll a[N]; ll b[N];void rep(ll &x){ x%=mod; x+=mod; x%=mod;}int main(){ //IOS; while(~sd(n)){ ll x=read(); ...2020-11-14 15:03:2855
0
-
原创 Nowcoder 20277 [SCOI2010]字符串(卡特兰数+组合数学)
题目一看就和卡特兰数有关,计算 即是最后的答案const ll mod=20100403;ll mul_mod(ll a,ll x,ll p){ ll ans=0; while(x){ if(x&1) ans=(ans+a)%p; a=(a+a)%p; x>>=1; } return ans;}ll pow_mod(ll a,ll x,ll p){ ll ans=1...2020-10-30 12:24:4124
0
-
原创 2020ICPC Intelligent Warehouse(线性动态规划)
其实看到这个题时能够想到 dp,当时想的是 dp[i] 以数 i 结尾的最大长度,其实想法没错,写了一个 O(n*n)的程序一开始的思路是,如果 dp[i] 是以 i 为结尾,那么(j<i 且 i %j ==0)的话,那么可以更新数组但是 n 太大,可以进行优化直至 O(n*sqrt(1e7)) ,换种思路想一下,以 i 为结尾,那么可以向后更新 dp[j],而不是向前更新O(n*n) 超时代码:int main(){ //IOS; while...2020-10-27 22:11:2478
0
-
原创 2020ICPC Matrix Subtraction(二维差分)
给出一个 n*m 的矩阵,再给出一个 大小为 x*y 的子矩阵,每次操作可以使矩阵内任意大小为 x*y 的矩阵内所有的元素减一,问是否可以使矩阵内所有元素都置 0const int N=1e3+5; int n,m,t; int i,j,k; int diff[N][N]; //差分数组 int sum[N][N]; //前缀和数组 int x,y;void add(int x,int y,int nx,int ny,int c){ ...2020-10-27 09:23:0745
0
-
原创 约瑟夫环(STL链表)
//#include <bits/stdc++.h>#include <iostream>#include <algorithm>#include <list>using namespace std;#define FOR(i,a,b) for(int i=a;i<=b;i++)#define null NULLconst double pi=3.14;const int N=2e5+5; int a[N];in...2020-10-27 08:30:0850
0
-
原创 2020ICPC Walking Machine(网格深搜)
有一个网格 n*m ,网格上有一个字母,必须按照网格上的指示移动,问从这 n*m 个点出发有几个点可以出界只要深搜姿势正确,再加点信心,AC 其实很简单const int N=1e3+5; int n,m,t; int i,j,k; char a[N][N]; int vis[N][N]; int flag=0;void dfs(int x,int y){ if(vis[x][y]==-1) return ; ...2020-10-26 23:33:3931
0
-
原创 最大乘积(数论结论)
尽可能的分成 3 的 k 次方,若余一,贪心取 4const ll mod=2000000000000000003;const int N=2e5+5; int n,m,t; int i,j,k;int main(){ //IOS; rush(){ sd(n); ll ans; if(n==1){ cout<<1<<endl; continue; } if(n...2020-07-14 18:45:3950
0
-
原创 减成一(差分)
链接:https://ac.nowcoder.com/acm/contest/5758/B题目描述存在n个数,每次操作可以任选一个区间使得区间内的所有数字减一。问最少多少次操作,可以让所有数都变成1。数据保证一定有解。输入描述:输入t,代表有t组数据。每组数据输入n,代表有n个数。接下来一行输入n个数,数字大小小于1e6。(t<=1000,n<1e5,∑n < 1e6)输出描述:每组数据输出一个整数代表最少需要操作的次数。输入...2020-06-01 13:53:5882
0
-
原创 三角形
题目描述小明有一根长度为a的木棒,现在小明想将木棒分为多段(每段木棒长度必须为整数),使得分隔后的木棍中,取出的任意三段都不能构成三角形,小明想知道木棒最多被分成几段?输入描述:输入数据的第一行是t,表示数据的组数, 接下来每组数据输入一个a(t<=1000, 1 <= a < 2^64 - 1)输出描述:对于每组输入样例,打印木棒最多被分为多少段示例1输入213输出12#pragma GCC optimize(2).2020-05-31 21:45:0397
0
-
原创 n的约数(数论+DFS)
const int N=100+5; ll n,m,t,ans; int i,j,k; int prime[N],num; bool vis[N],flag;void init(const int lock=100){ num=0; for(int i=2;i<=lock;i++){ if(!vis[i]){ prime[++num]=i; for(int j=2*i;j<...2020-07-05 09:45:471795
0
-
原创 贝伦卡斯泰露(DFS || BFS)
有题目可知,最后我们一定会得到 a数组与b 数组相等的情况const int N=50+5; int n,m,t; int i,j,k; int a[N],b[N],tag[N]; bool flag;void DFS(int pa,int pb,int cur)//pa a数组所储存的元素个数,pb b数组的元素个数,cur 原数组{ if(flag) return ; if(pa> (n>>1) ) return ...2020-07-04 23:27:20130
0