1 条题解
-
0
自动搬运
来自洛谷,原作者为

Tangninghaha
“I have nothing to offer but blood, toil, tears and sweat.”搬运于
2025-08-24 22:54:30,当前版本为作者最后更新于2024-01-20 16:07:11,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
看不清公式可以放大。
题意简单转化
首先有 。
证明:
因为当 时, 。
让我们钦定 ,那么
考虑 $\gcd(x^{a}-1,x^{b}-1)=\gcd(x^{a}-x^{b},x^{b}-1)=\gcd(x^{b}(x^{a-b}-1),x^{b}-1)$
由于 ,所以
$\gcd(x^{b}(x^{a-b}-1),x^{b}-1)=\gcd(x^{a-b}-1,x^{b}-1)$
我们发现指数在更相减损!
直到更相减损结束的时候,即 时,我们得到原式为 。
发现 且 ,将 都减去 ,原问题相当于 的问题。
这题中有多项式 $f(x)=(1+x)(1+x^{2})(1+x^{3})\cdots (1+x^{k})=c_{0}+c_{1}x+c_{2}x^{2}+\cdots+c_{t}x^{t}$。
我们知道展开这个多项式,就相当于在每一个括号内选取一项相乘。
,如果选择1,乘积的指数不变,表示子集中没有 。如果选择 ,乘积的指数增加了 ,表示子集中有 。那么如果展开后有一项 ,其中 是系数,那么 就表示子集和为 的方案数。
因为 是任意代入的,所以我们希望代入一些具有优秀性质的 来简化我们的运算。
引理
$$[m\vert i]=\frac{1}{m}\sum_{k=0}^{m-1}\omega_{m}^{ik} $$证明:
考虑等比数列求和:,分类讨论:
- 当 时,可以知道 不是 的倍数,并且 为0。
- 当 时,可以知道 是 的倍数,并且由于分母为0,此时不能使用等比数列求和公式,所以特判。此时 ,因为 是 的倍数。得到 ,所以除以 得到1。
将 次单位根代入得到 ,展开,由引理得到只有 时,系数为 的项的和不为0。而下标为 的倍数的数相加得到 。故答案为
问题转化为快速计算该式子。
当 为奇素数的时候:
考虑:根据单位根的定义,我们可以对 在复数域内进行因式分解。得到 $z^{m}-1=(z-\omega_{m}^{0})(z-\omega_{m}^{1})\cdots(z-\omega_{m}^{m-1})$,代入 ,进一步得到 $2=(1+\omega_{m}^{1})(1+\omega_{m}^{2})\cdots(1+\omega_{m}^{m})$。又因为 是素数,所以 $(1+\omega_{m}^{i})(1+\omega_{m}^{2i})\cdots(1+\omega_{m}^{mi})$ 的指数模 组成了一个完全剩余系,其值仍然等于2。
当然,如果 为偶数的时候,可以得到 ,所以该式子等于0。
进一步对其拓展,我们知道 是 的倍数,那么当 时, $f(\omega_{m}^{i})=(1+\omega_{m}^{i})(1+\omega_{m}^{2i})\cdots(1+\omega_{m}^{ni})=2^{\frac{n}{m}}$。当 时,该式等于 。
所以答案等于 。
拓展到 一般的情况,考虑假设,1~m分别乘 i 模 m 得到的剩余系,包含 个数,是由 个 模 的完全剩余系中的数字乘 得到的。
那么可以将 $(1+\omega_{m}^{i})(1+\omega_{m}^{2i})\cdots(1+\omega_{m}^{mi})$ 按照模 得到的值可以表示为 $[(1+\omega_{m}^{p})(1+\omega_{m}^{2p})\cdots(1+\omega_{m}^{m})]^{p}$。
所以 $f(\omega_{m}^{i})=[(1+\omega_{m}^{p})(1+\omega_{m}^{2p})\cdots(1+\omega_{m}^{m})]^{p\times \frac{n}{m}}$。
注意到单位根的性质 ,所以其实上式中括号内的部分就是 $(1+\omega_{\frac{m}{p}}^{1})(1+\omega_{\frac{m}{p}}^{2})\cdots(1+\omega_{\frac{m}{p}}^{\frac{m}{p}})$。
当 为偶数的时候,上面的式子为0。当 为奇数的时候,上面的式子为2。所以 $f(\omega_{m}^{i})=2^{p\times\frac{n}{m}}[2\nmid \frac{m}{p}]$。
所以答案等于 $\frac{1}{m}(2^{n}+\sum_{i=1}^{m-1}2^{\frac{n}{m}\times p}[2\nmid \frac{m}{p}])$。
我们之前特判了 的情况,其实 和 是一样的,当 时,,,所以式子可以简化为:
$$\frac{1}{m}(\sum_{i=0}^{m-1}2^{\frac{n}{m}\times p}[2\nmid \frac{m}{p}]) $$直接计算可以获得 85 分。
进一步优化,观察到如果 时, 对答案没有贡献。所以假设 ,其中 是一个奇数,那么 要求满足 。
所以有:
$$\begin{aligned} \frac{1}{m}(\sum_{i=0}^{m-1}2^{\frac{n}{m}\times p}[2\nmid \frac{m}{p}])&=\frac{1}{m}(\sum_{i=1}^{u}2^{\frac{n}{2^{k}\times u}\times \gcd(2^{k}\times u,2^{k}\times i)})\\ &=\frac{1}{m}(\sum_{i=1}^{u}2^{\frac{n}{u}\times \gcd(u,i)}) \end{aligned} $$考虑到 为 的约数,我们直接枚举 ,也就是:
$$\frac{1}{m}(\sum_{d\vert u}2^{\frac{n}{u}\times d}\times \varphi(\frac{u}{d})) $$因为 要求 ,所以有多少个 满足 就是与 互质的数字的个数。
由于 的特殊性(没有质因子2),所以其约数个数不会太多,1e7 之内大约只有 200 个,可以通过本题。
代码:
#include<cstdio> #include<cmath> using namespace std; using ll=long long; const int mod=998244353; const int M=1e7+5; ll qpow(ll a,ll b){ ll res=1; while(b){ if(b&1)res=res*a%mod; a=a*a%mod; b>>=1; } return res; } ll qpowNoMod(ll a,ll b){ ll res=1; while(b){ if(b&1)res=res*a; a=a*a; b>>=1; } return res; } int phi[M],pri[M],tot; bool vis[M]; void init(){ phi[1]=1; for(int i=2;i<=(int)1e7;++i){ if(!vis[i])phi[i]=i-1,pri[++tot]=i; for(int j=1;j<=tot;++j){ if(pri[j]*i>1e7)break; vis[pri[j]*i]=true; if(i%pri[j]==0){phi[pri[j]*i]=phi[i]*pri[j];break;} phi[pri[j]*i]=phi[i]*(pri[j]-1); } } } int gcd(int x,int y){ return y==0?x:gcd(y,x%y); } ll F(int m,int x,int y){ if(x==0||y==0)return 0; return qpowNoMod(m,gcd(x,y)); } int main(){ init(); int t; scanf("%d",&t); while(t--){ int m,a,b,c,d; scanf("%d%d%d%d%d",&m,&a,&b,&c,&d); ll l=F(m,a,b)+1,r=F(m,c,d); ll n=r-l+1; int u=m; while(!(u&1))u>>=1; ll ans=0; for(int i=1,_i=sqrt(u+0.5);i<=_i;++i){ if(u%i!=0)continue; ans+=qpow(2,n/u*i)*phi[u/i]%mod; if(i*i!=u){ int j=u/i; ans+=qpow(2,n/u*j)*phi[u/j]%mod; ans%=mod; } } ans*=qpow(m,mod-2); ans%=mod; printf("%lld\n",ans); } }
- 1
信息
- ID
- 9749
- 时间
- 2000ms
- 内存
- 512MiB
- 难度
- 7
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者