bzoj3202:[Sdoi2013]项链

时间:2022-10-27 15:35:28

思路:首先考虑如何求珠子个数,一个珠子由a,b,c三个数组成且属于区间[1,a],并满足gcd(a,b,c)=1。由于要求本质相同,对于a,b,c这样的一个无序的数列且满足gcd(a,b,c)=1,设其总方案数为t1,那么显然本质相同的重复了6次,即(a,b,c),(a,c,b),(b,a,c),(b,c,a),(c,a,b),(c,b,a),所以要将t1/=6,但如果存在两个数相同,这样的其实只出现了三次,因此还要加上3*这样的情况(设其为t2)的方案数,同时可能有三个相同,这样的情况只可能是(1,1,1),只出现了一次,又因为计算两个数相同时已经加了三次,所以要再加两次。

即珠子个数=t1+3*t2+2。t1,t2的求法要用到莫比乌斯反演

bzoj3202:[Sdoi2013]项链

bzoj3202:[Sdoi2013]项链

这个预处理mu可以sqrt(a)处理,然后考虑如何统计答案,联系bzoj4330爱之项链,那个题因为有特殊的东西使得不需要考虑是否本质不同,但本题是要考虑的,可以利用burnside引理,当旋转i格时,一共有gcd(n,i)个循环,且所有循环都是相邻的,这就相当于只考虑这长为gcd(n,i)的一段的合法的方案数,因为这样的话其余部分均可通过这一段置换得到,且本质相同。那这一段合法方案数有哪些呢,首先不仅相邻的不能相同,首尾也不能相同,因为置换后首就和尾相邻了,那么这不就变成了一个环且相邻颜色不同的总方案数了吗,设长为x的环的答案为f(x),于是最终答案即sigma(f(gcd(n,i)))。(f(x)=(m-1)^x+(x&1?1-m:m-1),m为颜色种类数,具体证明见http://www.cnblogs.com/DUXT/p/5951747.html

然后具体实现过程注意两个细节,一个vfk加强了数据,n有可能是p的倍数,因此不能直接求逆元,处理方法就是对求分子的过程中都对p^2取模,然后分子除以p,再乘以n/p在模p意义下的逆元即可,蒟蒻并不知道这是为什么。。。。。(当且仅当n是p的倍数是才能这么做)

然后可能出现long long*long long%long long,用一个乘爆的小技巧即可(详见函数mul())。

#include<iostream>
#include<cstdio>
using namespace std;
#define maxn 10001005 int cases,a,tot,p=1000000007;
int prime[maxn],mu[maxn],phi[maxn];
bool bo[maxn];
long long n,mod; long long mul(long long x,long long y){
long double t2=(long double)x*y/mod;
long long t1=x*y,t3=(long long)(t1-(long long)t2*mod)%mod;
return (t3+mod)%mod;
} long long power(long long a,long long k){
if (k==0) return 1;
if (k==1) return a%mod;
long long x=power(a,k/2),ans=mul(x,x);
if (k&1) ans=mul(ans,a);
return ans;
} long long fphi(long long x){
if (x<maxn) return phi[x];
long long ans=x;
for (int i=2;1ll*i*i<=x;i++)
if (x%i==0){
ans=ans-ans/i;
while (x%i==0) x/=i;
}
if (x!=1) ans=ans-ans/x;
return ans;
} long long solve(long long m,long long n){
return ((power(m-1,n)+(n&1?1ll-m:m-1ll))%mod+mod)%mod;
} void ex_gcd(long long a,long long b,long long &x,long long &y){
if (!b){x=1,y=0;return;}else ex_gcd(b,a%b,x,y);
long long x1=x,y1=y;
x=y1,y=x1-a/b*y1;
} long long inv(long long a){
long long x=0,y=0;ex_gcd(a,p,x,y);return (x%p+p)%p;
} int main(){
scanf("%d",&cases);mu[1]=1,phi[1]=1;
for (int i=2;i<maxn;i++){
if (!bo[i]) prime[++tot]=i,mu[i]=-1,phi[i]=i-1;
for (int j=1;j<=tot && i*prime[j]<maxn;j++){
bo[i*prime[j]]=1;
if (i%prime[j]==0){
mu[i*prime[j]]=0;
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
mu[i*prime[j]]=-mu[i],phi[i*prime[j]]=phi[i]*(prime[j]-1);
}
}
for (int i=2;i<maxn;i++) mu[i]+=mu[i-1];
while (cases--){
scanf("%lld%d",&n,&a);long long ans2=0,ans3=0;
if (n%p==0) mod=1ll*p*p;else mod=p;
for (int i=1,j;i<=a;i=j+1){
j=a/(a/i);
ans2=(ans2+mul((mu[j]-mu[i-1]),(1ll*(a/i)*(a/i)%mod)))%mod;
ans3=(ans3+mul((mu[j]-mu[i-1]),mul(1ll*(a/i)*(a/i)%mod,(a/i)%mod)))%mod;
}
long long m=mul((ans3+3*ans2%mod+2)%mod,power(6,1ll*p*(p-1)-1)),ans=0;
for (int i=1;1ll*i*i<=n;i++)
if (n%i==0){
ans=(ans+mul(solve(m,i),fphi(n/i)))%mod;
if (1ll*i*i!=n) ans=(ans+mul(solve(m,n/i),fphi(i)))%mod;
}
if (n%p!=0) ans=mul(ans,power(n,mod-2))%p;
else ans=ans/p,n=n/p,ans=mul(ans,inv(n))%p;
printf("%lld\n",ans);
}
return 0;
}

  

UPD:一年以后来复习的时候发现后面这个也会证了。。。。。

首先x/y(mod p)=x(mod yp)/p,当且仅当y|x时成立。

证明:令x/y=kp+m,即x=kyp+mp,然后有x=mp(mod yp),即x/p=m(mod yp),m就是x/y(mod p)。

然后此题的y=n,且满足y|x,然后用上面的那个公式就能得出以前的那个结论了。。。。。

bzoj3202:[Sdoi2013]项链的更多相关文章

  1. BZOJ3202 &lbrack;Sdoi2013&rsqb;项链

    Problem E: [Sdoi2013]项链 Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 427  Solved: 146[Submit][Sta ...

  2. 【BZOJ3202】项链(莫比乌斯反演,Burnside引理)

    [BZOJ3202]项链(莫比乌斯反演,Burnside引理) 题面 BZOJ 洛谷 题解 首先读完题目,很明显的感觉就是,分成了两个部分计算. 首先计算本质不同的珠子个数,再计算本质不同的项链个数. ...

  3. bzoj 3202&colon; &lbrack;Sdoi2013&rsqb;项链

    Description 项链是人体的装饰品之一,是最早出现的首饰.项链除了具有装饰功能之外,有些项 链还具有特殊显示作用,如天主教徒的十字架链和佛教徒的念珠. 从古至今人们为了美化人体本身,也美 化环 ...

  4. 洛谷P3307 &lbrack;SDOI2013&rsqb;项链 &lbrack;polya定理,莫比乌斯反演&rsqb;

    传送门 思路 很明显的一个思路:先搞出有多少种珠子,再求有多少种项链. 珠子 考虑这个式子: \[ S3=\sum_{i=1}^a \sum_{j=1}^a\sum_{k=1}^a [\gcd(i,j ...

  5. &lbrack;SDOI2013&rsqb;项链

    description luogu 最近,铭铭迷恋上了一种项链.与其他珍珠项链基本上相同,不过这种项链的珠子却与众不同,是正三菱柱的泰山石雕刻而成的. 三菱柱的侧面是正方形构成的,上面刻有数字. 能够 ...

  6. 洛谷 P3307&colon; bzoj 3202&colon; &lbrack;SDOI2013&rsqb; 项链

    题目传送门:洛谷P3307.这题在bzoj上是权限题. 题意简述: 这题分为两个部分: ① 有一些珠子,每个珠子可以看成一个无序三元组.三元组要满足三个数都在$1$到$m$之间,并且三个数互质,两个珠 ...

  7. Luogu3307:&lbrack;SDOI2013&rsqb;项链

    传送门 求每个珠子的方案数 即有序的求三元组 \((x,y,z),x,y,z\le a\) 满足 \(gcd(x,y,z)=1\) 设 \(G_i\) 表示 \(i\) 个小于等于 \(a\) 的有序 ...

  8. bzoj 3202 &lbrack;Sdoi2013&rsqb;项链——容斥&plus;置换&plus;推式子

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3202 可见Zinn博客:https://www.cnblogs.com/Zinn/p/100 ...

  9. 洛谷 P3307 - &lbrack;SDOI2013&rsqb;项链(Burnside 引理&plus;数论)

    题面传送门 看到题目我们显然可以将题目拆分成两部分:首先求出有多少个符合要求的珠子 \(c\),这样我们就可以将每种珠子看成一种颜色,题目也就等价于有多少种用 \(c\) 种颜色染长度为 \(n\) ...

随机推荐

  1. Unity3d 提示 &quot&semi;The scripts file name does not match the name of the class defined in the script&excl;&quot&semi;的解决办法

    有两个原因,一个是文件的名称和类名不一致 第二个原因是有命名空间, 排除应该是可以修复的

  2. hdu 2091

    PS:PE了两次....又是这种奇怪的输出格式....两个三角形直接有空行.. 代码: #include "stdio.h" void ou(int n,char a); void ...

  3. 【HAOI2009】【P1307】毛毛虫

    感觉相比其他树归题简单多了,不过有点绕(也许是我的思路很奇怪一.一)(这是省选题啊,就算作为T1这题也太水了,HA好弱……) 原题: 对于一棵树,我们可以将某条链和与该链相连的边抽出来,看上去就象成一 ...

  4. C语言 小游戏之贪吃蛇

    还记得非常久曾经听群里人说做贪吃蛇什么的,那时候大一刚学了C语言,认为非常难,根本没什么思路. 前不久群里有些人又在谈论C语言贪吃蛇的事了,看着他们在做,我也打算做一个出来. 如今大三,经过了这一年半 ...

  5. jsp页面从标签属性中获取值

    你还可以在"data-*" 属性里使用json语法,例如 <div id="awesome-json" data-awesome='{"game ...

  6. C&num; Task 篇幅一

    在https://www.cnblogs.com/loverwangshan/p/10415937.html中我们有讲到委托的异步方法,Thread,ThreadPool,然后今天来讲一下Task, ...

  7. 19&period;3&period;20 解决pycharm快捷键无法使用问题和熟悉git与码云操作流程

    problem:由于Vim插件导致快捷键无法使用: answer:settings→Plugins→搜索到ideaVim→取消选中→apply→重启pycharm: git:创建仓库→生成公钥(ssh ...

  8. Previous Permutation

    Similar to next permutation, the steps as follow: 1) Find k in the increasing suffix such that nums[ ...

  9. js设计模式之发布&sol;订阅模式模式

    一.前言 发布订阅模式,基于一个主题/事件通道,希望接收通知的对象(称为subscriber)通过自定义事件订阅主题,被激活事件的对象(称为publisher)通过发布主题事件的方式被通知. 就和用户 ...

  10. TCxGrid 把列移上移下。

    T