数学专题测试2
A.B
看到$gcd==1$大约是莫比乌斯反演。然后只需要求出来$gcd$至少为$i$的方案数,推一下可以发现是个组合数并且只与$n/i$有关,于是直接分块就可以了。
然后发现这个东西需要求莫比乌斯函数前缀和,杜教筛即可。
然而这样是$O(\sqrt{n}*k)$的,会T,所以只需要预处理一部分阶乘逆元,然后就可以$O(1)$算出大部分组合数,其余直接$O(k)$暴力即可。
B. B君的回忆
题意:给定一个类斐波那契数列$g(n)$,求其嵌套$k$次之后在$N$处的取值。
可以发现,这个东西在区模意义下是有循环节的,并且打表发现,循环节的长度大约与$p$同级。于是可以用BSGS对于转移矩阵求出这个循环节,这样卡卡常就有60~80了。
然而这样在极限数据下复杂度可以达到$O(TK\sqrt{p})$,在本题肯定过不去。
于是可以考虑一些性质。
设$f(a)$表示在模a意义下的循环节,那么有结论:
1.若a,b互质,那么$f(ab)=lcm(f(a)f(b))$。
2.若p为质数,那么$f(p^{k})=p^{k-1}*f(k)$。
第一个比较好理解,第二个可以类比欧拉函数的一些性质,实际上这两个函数也有很多的相似点。
于是可以将每个模数分解质因数,然后对于每个质数暴力BSGS求出循环节,顺便记忆化一下,然后求出$lcm$,就可以AC了。
C. sanrd
大神题,考场上打出来真的挺难的。。。然而暴力还是能AC的
首先特判$C=0$,然后特判$b=0$,然后化简,中间有一些技巧:
$c^{2ij}=c^{(i+j)^2-i^2-j^2}$,于是可以将两部分贡献分开,然后化出卷积式。
另一个技巧是$b*c^{4k}+d*c^{2k}+e$,将其转化为$a*(c^{2k}+y)^2+z$,其中$a,y,z$是可以推出的常数,然后就可以二项式展开。
然而这题可以数据范围小,时限长,所以直接秦九韶循环展开暴力就可以。考场上自认为大约有六七十分了感觉良好,没想到直接AC了。。。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long LL; 4 const int mod=1e6+3,N=6e4+5; 5 inline int read(int x=0,bool f=0,char ch=getchar()){ 6 for(;!isdigit(ch);ch=getchar()) f=ch=='-'; 7 for(; isdigit(ch);ch=getchar()) x=(x<<3)+(x<<1)+(ch^48); 8 return f?-x:x; 9 } 10 int n; 11 long long a[N],b,c,d,e; 12 inline LL qpow(LL x,LL y,LL ans=1){ 13 for(;y;y>>=1,x=x*x%mod) if(y&1) ans=ans*x%mod; 14 return ans; 15 } 16 int main(){ 17 n=read(),b=read(),c=read(),d=read(),e=read(); 18 for(int i=0;i<n;++i) a[i]=read(); 19 for(int i=0;i<n;++i){ 20 LL x=(b*qpow(c,4*i)+d*qpow(c,2*i)+e)%mod,X2=x*x%mod,X3=X2*x%mod, 21 X4=X3*x%mod,X5=X4*x%mod,X6=X5*x%mod,X7=X6*x%mod,X8=X7*x%mod,X9=X8*x%mod, 22 X10=X9*x%mod,X11=X10*x%mod,X12=X11*x%mod,X13=X12*x%mod,X14=X13*x%mod 23 ,X15=X14*x%mod,X16=X15*x%mod,X17=X16*x%mod,X18=X17*x%mod, 24 X19=X18*x%mod,X20=X19*x%mod,X21=X20*x%mod,X22=X21*x%mod, 25 X23=X22*x%mod,X24=X23*x%mod,X25=X24*x%mod,X26=X25*x%mod, 26 X27=X26*x%mod,X28=X27*x%mod,X29=X28*x%mod,X30=X29*x%mod, 27 X31=X30*x%mod,X32=X31*x%mod,X33=X32*x%mod,X34=X33*x%mod, 28 X35=X34*x%mod,X36=X35*x%mod,X37=X36*x%mod,X38=X37*x%mod, 29 X39=X38*x%mod,X40=X39*x%mod,X41=X40*x%mod,X42=X41*x%mod, 30 X43=X42*x%mod,X44=X43*x%mod,X45=X44*x%mod,X46=X45*x%mod, 31 X47=X46*x%mod,X48=X47*x%mod,X49=X48*x%mod,X50=X49*x%mod,ans=0; 32 register int j; 33 for(j=n-1;j>49;j-=50){ 34 ans=ans*X50,ans+=a[j]*X49,ans+=a[j-1]*X48, 35 ans+=a[j-2]*X47,ans+=a[j-3]*X46,ans+=a[j-4]*X45, 36 ans+=a[j-5]*X44,ans+=a[j-6]*X43,ans+=a[j-7]*X42, 37 ans+=a[j-8]*X41,ans+=a[j-9]*X40,ans+=a[j-10]*X39, 38 ans+=a[j-11]*X38,ans+=a[j-12]*X37,ans+=a[j-13]*X36, 39 ans+=a[j-14]*X35,ans+=a[j-15]*X34,ans+=a[j-16]*X33, 40 ans+=a[j-17]*X32,ans+=a[j-18]*X31,ans+=a[j-19]*X30, 41 ans+=a[j-20]*X29,ans+=a[j-21]*X28,ans+=a[j-22]*X27, 42 ans+=a[j-23]*X26,ans+=a[j-24]*X25,ans+=a[j-25]*X24, 43 ans+=a[j-26]*X23,ans+=a[j-27]*X22,ans+=a[j-28]*X21, 44 ans+=a[j-29]*X20,ans+=a[j-30]*X19,ans+=a[j-31]*X18, 45 ans+=a[j-32]*X17,ans+=a[j-33]*X16,ans+=a[j-34]*X15, 46 ans+=a[j-35]*X14,ans+=a[j-36]*X13,ans+=a[j-37]*X12, 47 ans+=a[j-38]*X11,ans+=a[j-39]*X10,ans+=a[j-40]*X9, 48 ans+=a[j-41]*X8,ans+=a[j-42]*X7,ans+=a[j-43]*X6, 49 ans+=a[j-44]*X5,ans+=a[j-45]*X4,ans+=a[j-46]*X3, 50 ans+=a[j-47]*X2,ans+=a[j-48]*x,ans+=a[j-49],ans%=mod; 51 } 52 for(;~j;--j) (ans=ans*x+a[j])%=mod; 53 printf("%lld\n",ans%mod); 54 } 55 return 0; 56 }暴力