P4450-双亲数,P5221-Product,P6055-[RC-02]GCD【莫比乌斯反演,杜教筛】
除了最后一題都比較簡單就寫一起了
P4450-雙親數
題目鏈接:https://www.luogu.com.cn/problem/P4450
題目大意
給出A,B,dA,B,dA,B,d求有多少對(a,b)(a,b)(a,b)滿足gcd(a,b)=dgcd(a,b)=dgcd(a,b)=d且a∈[1,A],b∈[1,B]a\in[1,A],b\in[1,B]a∈[1,A],b∈[1,B]
解題思路
很顯然的容斥,枚舉ddd的倍數iii,然后容斥系數就是μ(id)\mu(\frac{i}ze8trgl8bvbq)μ(di?)。
時間復雜度O(n)O(n)O(n)
code
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=1e6+10; int A,B,d,mu[N],pri[N],cnt; long long ans; bool v[N]; int main() {scanf("%d%d%d",&A,&B,&d);mu[1]=1;for(int i=2;i<N;i++){if(!v[i])pri[++cnt]=i,mu[i]=-1;for(int j=1;j<=cnt&&i*pri[j]<N;j++){v[i*pri[j]]=1;if(i%pri[j]==0)break;mu[i*pri[j]]=-mu[i];}}if(A>B)swap(A,B);for(int i=d;i<=A;i+=d)ans+=1ll*(A/i)*(B/i)*mu[i/d];printf("%lld\n",ans); }P5221-Product
題目鏈接:https://www.luogu.com.cn/problem/P5221
題目大意
給出nnn求
∏i=1n∏j=1nlcm(i,j)gcd(i,j)\prod_{i=1}^n\prod_{j=1}^n\frac{lcm(i,j)}{gcd(i,j)}i=1∏n?j=1∏n?gcd(i,j)lcm(i,j)?
解題思路
CYJian\text{CYJian}CYJian的題啊,時限0.2s?0.2s?0.2s?不過只是看起來花里胡哨,沒有其他CYJian\text{CYJian}CYJian的題那么難。
先簡單把lcmlcmlcm拆出來化一下式子
(∏i=1n∏j=1ni×j)1(∏i=1n∏j=1ngcd(i,j))2\left(\prod_{i=1}^n\prod_{j=1}^ni\times j\right)\frac{1}{\left(\prod_{i=1}^{n}\prod_{j=1}^ngcd(i,j)\right)^2}(i=1∏n?j=1∏n?i×j)(∏i=1n?∏j=1n?gcd(i,j))21?
左邊那個很容易求就是(n!)2n(n!)^{2n}(n!)2n,右邊那個因為是乘積所以很好做,直接枚舉質數冪ded^ede,讓有?nde?2\lfloor\frac{n}{d^e}\rfloor^2?den??2對數的gcdgcdgcd包含ded^ede,會產生這么多的貢獻,但是因為在de?1d^{e-1}de?1的時候也統計過一次,所以只需要產生ddd的貢獻就好了。
時間復雜度O(nlog?n)O(n\log n)O(nlogn)
code
#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const ll N=1e6+10,P=104857601; ll n,ans,cnt,pri[N]; bool v[N]; ll power(ll x,ll b){ll ans=1;while(b){if(b&1)ans=ans*x%P;x=x*x%P;b>>=1;}return ans; } signed main() {scanf("%lld",&n);ans=1;for(ll i=2;i<=n;i++){if(!v[i]){for(ll j=i;j<=n;j=j*i)ans=ans*power(i,(n/j)*(n/j)%(P-1))%P;pri[++cnt]=i;}for(ll j=1;j<=cnt&&i*pri[j]<=n;j++){v[i*pri[j]]=1;if(i%pri[j]==0)break;}}ans=power(ans*ans%P,P-2);ll f=1;for(ll i=1;i<=n;i++)f=f*i%P;f=power(f,2*n);ans=ans*f%P;printf("%lld",ans);return 0; }P6055-[RC-02]GCD
題目鏈接:https://www.luogu.com.cn/problem/P6055
題目大意
給出nnn求
∑i=1n∑j=1n∑p=1?nj?∑q=1?nj?[gcd(i,j)=1][gcd(p,q)=1]\sum_{i=1}^n\sum_{j=1}^n\sum_{p=1}^{\lfloor\frac{n}{j}\rfloor}\sum_{q=1}^{\lfloor\frac{n}{j}\rfloor}[gcd(i,j)=1][gcd(p,q)=1]i=1∑n?j=1∑n?p=1∑?jn???q=1∑?jn???[gcd(i,j)=1][gcd(p,q)=1]
解題思路
剛開始還以為可以直接暴力整除分塊+杜教篩歐拉函數然后O(n34)O(n^{\frac{3}{4}})O(n43?)搞,然后發現時限是1s1s1s。
發現這個式子的順序很奇怪,特意的把jjj放在了里面。這個提示我們jjj其實是在枚舉ppp和qqq的gcdgcdgcd。
而又jjj和iii互質,其實這個式子的真正目的是對于每個iii求有多少對數的gcdgcdgcd和iii互質然后求和。換成式子就是
∑i=1n∑q=1n∑p=1n[gcd(gcd(q,p),i)=1]\sum_{i=1}^n\sum_{q=1}^n\sum_{p=1}^n[gcd(gcd(q,p),i)=1]i=1∑n?q=1∑n?p=1∑n?[gcd(gcd(q,p),i)=1]
就是三對數之間互質的對數,之間上莫反就可以了
∑i=1n?ni?3μ(i)\sum_{i=1}^n\lfloor\frac{n}{i}\rfloor^3\mu(i)i=1∑n??in??3μ(i)
nnn比較大,要用杜教篩篩一下mumumu
時間復雜度O(n23)O(n^{\frac{2}{3}})O(n32?)?
code
#include<cstdio> #include<cstring> #include<algorithm> #include<map> #define ll long long using namespace std; const ll N=1e7+10,P=998244353; ll n,cnt,pri[N],mu[N],ans; map<ll,ll> mp; bool v[N]; ll get_sum(ll n){if(mp.find(n)!=mp.end())return mp[n];if(n<N)return mu[n];ll rest=1;for(ll l=2,r;l<=n;l=r+1)r=n/(n/l),(rest+=P-(r-l+1)*get_sum(n/l))%=P;return mp[n]=rest; } signed main() {scanf("%lld",&n);mu[1]=1;for(ll i=2;i<N;i++){if(!v[i])pri[++cnt]=i,mu[i]=-1;for(ll j=1;j<=cnt&&i*pri[j]<N;j++){v[i*pri[j]]=1;if(i%pri[j]==0)break;mu[i*pri[j]]=-mu[i];}}for(ll i=1;i<N;i++)(mu[i]+=mu[i-1])%=P;for(ll l=1,r;l<=n;l=r+1){r=n/(n/l);ll p=n/l;p=p*p%P*p%P;(ans+=p*(get_sum(r)-get_sum(l-1))%P)%=P;}printf("%lld\n",(ans+P)%P);return 0; } 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的P4450-双亲数,P5221-Product,P6055-[RC-02]GCD【莫比乌斯反演,杜教筛】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: P6097-[模板]子集卷积
- 下一篇: 音响有杂音怎么办 ?解决方法总结如下