国庆集训 DAY1 总结
几天的颓废让本就蒻的 zsw 蒻上加蒻,枯了。
前三题
水题而且 2,3 题都写过嘿嘿。
T1:稍作处理然后背包即可,注意细节。
T2:上次出过的题然后我还 A 过,不过这次比较懒写都没写,乐。是道背包题再加上组合数学,不算很难。
T3:洛谷就有,注意图不一定连通。
T4
题意:
给定一个整数
(1)序列长度为
(2)序列中所有的元素相乘恰好等于
思路:
笑死考场想歪了,不断在往斯特林数上靠,其实是插板法的题。
显然要质因数分解,不妨考虑
把序列的元素看成箱子,要在
那么推广到
最后考虑正负的情况,
(聪明的同学都知道,还有
然后用逆元求组合数就好了。
T5
题意:
有一条
求所有的
思路:
直接给出西格玛的题目一般都有两种做法:
-
拆掉一个西格玛,然后寻找相邻元素的递推关系。在这道题里就是:令
s_r=\sum f(l,r) ,则答案为\sum s_r ,难点是s_r 的求法。 -
贡献法,即考虑每个元素会被算入贡献多少次。此题的“元素”就是连通块。
回到本题。第一种方法可以快速得到一种
那么把注意力聚集在第二种方法上,又能延伸出两种写法。
官方做法:注意到链的特殊性质:连通块数量
ljs 大佬做法:单独考虑每个连通块,发现单次贡献是
代码
T4:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod=1e9+7,N=2e6+5;
int t,x,y,jc[N]={1},zf,ans;
inline int qstp(int a,int p){
int base=a,s=1;
while(p){
if(p&1) s=s*base%mod;
base=base*base%mod;
p>>=1;
}
return s;
}
inline int C(int n,int m){
return jc[n]*qstp(jc[n-m],mod-2)%mod*qstp(jc[m],mod-2)%mod;
}
signed main(){
for(int i=1; i<=2e6;i++) jc[i]=jc[i-1]*i%mod;
scanf("%lld",&t);
while(t--){
scanf("%lld%lld",&x,&y);
ans=1;
for(int i=2; i*i<=x;i++){
int c=0;
while(x%i==0) ++c,x/=i;
if(c) ans=(ans*C(c+y-1,y-1))%mod;
}
if(x>1) ans=(ans*C(y,y-1))%mod;
printf("%lld\n",ans*qstp(2,y-1)%mod);
}
return 0;
}