简单的数学题 - 数论

题目大意:给定正整数nn,求有多少个整数四元组a,b,c,d∈[0,n−1]a,b,c,d\in [0,n-1]a,b,c,d[0,n1]满足ab=cd(modn)ab=cd\pmod nab=cd(modn)。由于nnn非常大,将以质因数分解的形式给出n=∏i=1mpicin=\prod_{i=1}^mp_i^{c_i}n=i=1mpicim≤5×105,p,c≤109m\le5\times 10^5,p,c\le10^9m5×105,p,c109
题解:由中国剩余定理的结论知我们只需要求出n=pcn=p^cn=pc的答案然后乘起来即可。
考虑这个怎么做,不妨设cnti=∑(a,b)[ab mod n=i]cnt_i=\sum_{(a,b)}[ab\bmod n=i]cnti=(a,b)[abmodn=i],那么答案就是∑i=0n−1cnti2\sum_{i=0}^{n-1}cnt^2_ii=0n1cnti2。显然cnt0=n2−∑i=1n−1cnticnt_0=n^2-\sum_{i=1}^{n-1}cnt_icnt0=n2i=1n1cnti,考虑某个cnti(i>0)cnt_i(i>0)cnti(i>0)怎么算。
不妨设i=pkqi=p^kqi=pkq,满足gcd⁡(p,q)=1\gcd(p,q)=1gcd(p,q)=1。显然0≤k&lt;c,q&gt;00\le k&lt;c,q&gt;00k<c,q>0
那么ab=iab=iab=i,等价于a=pk′a′,b=pk−k′b′,gcd⁡(a′,p)=gcd⁡(b′,p)=1,a′b′=q(modpc−k)a=p^{k&#x27;}a&#x27;,b=p^{k-k&#x27;}b&#x27;,\gcd(a&#x27;,p)=\gcd(b&#x27;,p)=1,a&#x27;b&#x27;=q\pmod {p^{c-k}}a=pka,b=pkkb,gcd(a,p)=gcd(b,p)=1,ab=q(modpck),并且每求出这样的一组(a′,b′,k′)(a&#x27;,b&#x27;,k&#x27;)(a,b,k),都会有pk′×pk−k′=pkp^{k&#x27;}\times p^{k-k&#x27;}=p^kpk×pkk=pk(a,b,k)(a,b,k)(a,b,k)与之对应,而(a′,b′,k′)(a&#x27;,b&#x27;,k&#x27;)(a,b,k)的组数显然就是ϕ(pc−k)\phi(p^{c-k})ϕ(pck),与k′k&#x27;k无关,因此对于每个k′k&#x27;k,答案就是pkϕ(pc−k)p^{k}\phi(p^{c-k})pkϕ(pck),因此cnti=(k+1)pkϕ(pc−k)=(k+1)ϕ(pc)cnt_i=(k+1)p^k\phi(p^{c-k})=(k+1)\phi(p^c)cnti=(k+1)pkϕ(pck)=(k+1)ϕ(pc)
然后考虑对于每个kkk有多少个iii,显然就是ϕ(pc−k)\phi(p^{c-k})ϕ(pck)
首先考虑∑i=1n−1cnti2=∑k=0c−1(k+1)2ϕ2(pc)ϕ(pc−k)=ϕ2(pc)(p−1)pc∑k=1ck2(1p)k\sum_{i=1}^{n-1}cnt_i^2=\sum_{k=0}^{c-1}(k+1)^2\phi^2(p^c)\phi(p^{c-k})=\phi^2(p^c)(p-1)p^c\sum_{k=1}^ck^2\left(\frac{1}{p}\right)^ki=1n1cnti2=k=0c1(k+1)2ϕ2(pc)ϕ(pck)=ϕ2(pc)(p1)pck=1ck2(p1)k
后面那个怎么求:
S2=∑k=1nk2qkS2−n2qn=∑k=2n(k−1)2qk−1qS2−n2qn+1=∑k=2n(k2−2k+1)qkqS2−n2qn+1=∑k=2nk2qk−2∑k=2nkqk+∑k=2nqkqS2−n2qn+1=S2−q+2(S1−q)+S0−qS2=n2qn+1−q+2(S1−q)+S0−qq−1S_2=\sum_{k=1}^n k^2q^k\\ S_2-n^2q^n=\sum_{k=2}^n(k-1)^2q^{k-1}\\ qS_2-n^2q^{n+1}=\sum_{k=2}^n(k^2-2k+1)q^k\\ qS_2-n^2q^{n+1}=\sum_{k=2}^nk^2q^k-2\sum_{k=2}^nkq^k+\sum_{k=2}^nq^k\\ qS_2-n^2q^{n+1}=S_2-q+2(S_1-q)+S_0-q\\ S_2=\frac{n^2q^{n+1}-q+2(S_1-q)+S_0-q}{q-1} S2=k=1nk2qkS2n2qn=k=2n(k1)2qk1qS2n2qn+1=k=2n(k22k+1)qkqS2n2qn+1=k=2nk2qk2k=2nkqk+k=2nqkqS2n2qn+1=S2q+2(S1q)+S0qS2=q1n2qn+1q+2(S1q)+S0q

其中S1=∑k=1nkqk,S0=∑k=1nqkS_1=\sum_{k=1}^nkq^k,S_0=\sum_{k=1}^nq^kS1=k=1nkqk,S0=k=1nqk,求法同理。
剩余还有一个cnt02cnt_0^2cnt02,过程类似,略。

// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define Rep(i,v) rep(i,0,(int)v.size()-1)
#define lint long long
#define mod 1000000007
#define ull unsigned lint
#define db long double
#define pb push_back
#define mp make_pair
#define fir first
#define sec second
#define gc getchar()
#define debug(x) cerr<<#x<<"="<<x
#define sp <<" "
#define ln <<endl
using namespace std;
typedef pair<int,int> pii;
typedef set<int>::iterator sit;
inline int inn()
{
    int x,ch;while((ch=gc)<'0'||ch>'9');
    x=ch^'0';while((ch=gc)>='0'&&ch<='9')
        x=(x<<1)+(x<<3)+(ch^'0');return x;
}
inline int fast_pow(int x,int k,int ans=1) { for(;k;k>>=1,x=(lint)x*x%mod) (k&1)?ans=(lint)ans*x%mod:0;return ans; }
inline int inv(int x) { return fast_pow(x,mod-2); }
inline lint squ(int x) { return (lint)x*x; }
inline int solve(int p,int c)
{
    int n=fast_pow(p,c),t=n-fast_pow(p,c-1);if(t<0) t+=mod;
    int q=inv(p),v=fast_pow(q,c),z=inv(q-1),c0=q*(v-1ll)%mod*z%mod;
    int c1=((lint)c*v%mod*q-c0)%mod*z%mod;if(c1<0) c1+=mod;
    int c2=((lint)c*c%mod*v%mod*q%mod-q-2ll*(c1-q)%mod+(lint)q*(c0-v)%mod)*z%mod;if(c2<0) c2+=mod;
    return ((lint)t*t%mod*(p-1)%mod*n%mod*c2+squ((lint)n*n%mod-t*(p-1ll)%mod*n%mod*c1%mod))%mod;
}
int main()
{
    int ans=1;
    for(int T=inn(),p,c;T;T--) p=inn(),c=inn(),ans=(lint)ans*solve(p,c)%mod;
    return !printf("%d\n",ans);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值