Luogu P3362 Cool loves shaxian 生成函数】的更多相关文章

题意: 定义f(i)=∑ k∣i k^d(i≤n),给出q个询问,每个询问询问区间[l,r]的f(i)的和. n<=1e7 d<=1e18 q<=5e4 可以发现f(i)是个积性函数,那么我们就可以欧拉筛 O(n) 预处理出f(i),然后做个前缀和就行了. f(i)分为三种情况: 1.i为素数 f(i)=i^d 2.i%p[j]!=0 f(i*pj)=f(i)*f(p[j]) 3.i%p[j]==0 这个比较复杂,以下是f老板说的:我们要考虑的是i*p[j]比i多的约数是什么,假设i*p…
题目链接:https://www.luogu.org/problemnew/show/P2397 卡空间. 对于众数出现次数 > n/2 我们考虑rand. 每次正确的概率为1/2,五个测试点,全对的概率为1/32. 所以: #include <ctime> #include <cstdio> #include <cstdlib> using namespace std; int n, m; int main() { scanf("%d",&a…
先ORZ\(Owen\)一发.感觉是个很套路的题,这里给一个蒟蒻的需要特判数据的伪\(n\log^2 n\)算法,真正的两只\(\log\)的还是去看标算吧(但这个好想好写跑不满啊) 首先这种树上路径统计的问题我们先套一个点分治上去就是了,然后求出分治中心连出去的每一条路径 我们还是套路地分成不同子树求解,如果我们对一条路径设一个二元组\((dep,val)\)表示到分治中心的深度以及路径上的最大值,那么就考虑怎么把一棵子树内的路径和其它子树的合并了 考虑如果只有一个端点限制怎么做,很容易想到它…
题目传送门 虽然只是一道黄题,但还是学到了一点新知识-- 摩尔投票法 用\(O(1)\)的内存,\(O(n)\)的时间来找出一串长度为n的数中的众数,前提是众数出现的次数要大于\(n/2\) 方法很简单: for(int i=1;i<=n;i++){ int x; scanf("%d",&x); if(ans==x) cnt++; else if(cnt==0) ans=x,cnt++; else cnt--; } 因为众数的数量要大于\(n/2\),所以无论再怎么散,也…
传送门 题解 既然是选取区间,没说顺序 肯定先排遍序 都是套路 那么按什么排序呢??? 为了方便处理 我们把区间按左端点从小到大排序 把关键点也按从小到大排序 假设当扫到 \(i\) 点时,i 点之前的点都已处理完毕 (已达上限,或是覆盖了的区间全部取了) 既然要选的区间多 所以需要选的区间对后面的影响少,所以把所有覆盖了当前关键点按右端点从小到大依次选取,直至上限满了为止 这个 用set就解决了 不过一定要记得把右端点小于当前关键点的区间弹掉 代码 #include<bits/stdc++.h…
更好的阅读体验 Portal Portal1: Codeforces Portal2: Luogu Description Petya loves lucky numbers. Everybody knows that lucky numbers are positive integers whose decimal representation contains only the lucky digits \(4\) and \(7\). For example, numbers \(47\)…
题目链接: https://jzoj.net/senior/#main/show/6084 https://www.luogu.org/problemnew/show/P4916 题目: 题解: 注:本题解大部分摘自Imagine大佬提供在洛谷的题解 我们设$f(x)$表示最小循环节长度为x的合法序列数,那么有$ans=\sum_{d|gcd(n,m)}\frac{1}{d}f(d)$ 这是因为最小循环节为d的序列对应的环会被计算d次,比如 0101,最小循环节长度为 2(循环节为 01),其对…
题目链接 一道好题,第一次用生成函数做题.感谢赛珂狼教我这个做法. 首先我们显然可以把题目中的限制转化成一个二分图的模型:左边有$n$个点,右边有$m$个点,如果在棋盘$(i,j)$这个点上放了炮,那么我们把左边第$i$个点向右边第$j$个点连边,那么最终这个图上左边每个点的度数都是$2$,右边每个点的度数都小于等于$2$.求合法图的个数.可以发现,这个二分图是由一些环和一些链组成的,每一条链都是属于右边的点数比属于左边的点数多一(我们把属于右边的单独的一个点也算作一条链).并且这样链的条数恰好…
模板题. 将所有的多项式按等比数列求和公式将生成函数压缩,相乘后麦克劳林展开即可. Code: n=int(input()) print((n+1)*(n+2)*(n+3)*(n+4)//24)…
题意: 题解: 这道题我思路大方向是正确的,但是生成函数推错导致一直WA,看了标程才改对-- 首先一个长为\(m\)的轮换的\(n\)次幂会分裂成\(\gcd(n,m)\)个长为\(\frac{m}{\gcd(n,m)}\)的轮换 所以合并的时候相当于对于一个长度\(l\)若存在一个\(m\)使得\(\frac{m}{\gcd(n,m)}=l\)则\(\gcd(n,m)\)个长度为\(l\)的轮换可以合并 显然不同长度的轮换是互不影响的,那么我们可以分开每种长度计算 就相当于对于一个长度为\(l…