3202: [Sdoi2013]项链

Time Limit: 30 Sec Memory Limit: 512 MB
Submit: 392 Solved: 135
[Submit][Status][Discuss]
Description

项链是人体的装饰品之一,是最早出现的首饰。项链除了具有装饰功能之外,有些项 链还具有特殊显示作用,如天主教徒的十字架
链和佛教徒的念珠。 从古至今人们为了美化人体本身,也美 化环境,制造了各种不同风格,不同特点、不同式样的项链,满足了不同肤色、不同民族、不同审美观的人的审美需要。就材料而论,首
饰市场上的项链有黄金、白银、珠宝等几种。珍珠项链为珍珠制成的饰品,即将珍珠 钻孔后用线串在一起,佩戴于项间。天然珍珠项链具有一定的护养作用。

最近,铭铭迷恋上了一种项链。与其他珍珠项链基本上相同,不过这种项链的珠子却 与众不同,是正三菱柱的泰山石雕刻而成的。三菱柱的侧面是正方形构成的,上面刻有数字。 能够让铭铭满意的项链必须满足下面的条件:
1:这串项链由n颗珠子构成的。
2:每一个珠子上面的数字x,必须满足0 < x <= a,且珠子上面的数字的最大公约数要恰 好为1。两个珠子被认为是相同的,当且仅当他们经过旋转,或者翻转后能够变成一样的。 3:相邻的两个珠子必须不同。
4:两串项链如果能够经过旋转变成一样的,那么这两串项链就是相同的! 铭铭很好奇如果给定n和a,能够找到多少不同串项链。由于答案可能很大,所以对输 出的答案mod 1000000007。

Input

数据由多组数据构成:
第一行给定一个T<=10,代表由T组数据。
接下来T行,每行两个数n和a。

Output

对于每组数据输出有多少不同的串。

Sample Input

1 2  2

Sample Output

3

HINT

对于100%的数据:所有的n<=10^14,a<=10^7,T<=10; 样例解释:由三种珠子:[1,1,1],[1,1,2],[1,2,2].组成的串有:[1,2],[1,3],[2,3]。

先不考虑题目中所说的gcd=1gcd=1的情况,那么就是从可重元素中取k个有多少种取法。因为可以重复选,所以多加入kk个元素,就相当于要把这n+kn+k个元素分成nn份有多少种取法。可以用插板法,在n+k−1n+k-1个空中找n−1n-1个空。就是C(n+k−1,n−1)C(n+k-1,n-1)
也就等价于我们第一问要求的珠子的种数o=C(n+2,3)o=C(n+2,3)
然后再把gcd!=1gcd!=1的充斥掉:那就是减去1个质数的,加上2个质数的……,那么最后就是用莫比乌斯函数容斥一下:o=∑d|aμ(d)∗C(ad+2,3)o=\sum_{d|a}\mu(d)*C(\frac{a}{d}+2,3)
然后就应该用到群论的知识了,由于不会群论,所以听了大神莫比乌斯反演的方法。
F(x)表示最短循环节长度为x的数量F(x)表示最短循环节长度为x的数量
f(x)=∑i|xF(x)f(x)=\sum_{i|x}F(x)
那么最后的答案就是ans=∑d|nF(d)dans=\sum_{d|n}\frac{F(d)}{d}因为旋转之后相同的算一种,所以一个长度为d的会被统计d次。
ans=∑d|nF(d)dans=\sum_{d|n}\frac{F(d)}{d}
      =∑d|n∑p|dμ(p)f(dp)d\ \ \ \ \ \ =\sum_{d|n}\frac{\sum_{p|d}{\mu(p)f(\frac{d}{p})}}{d}
      =∑d|n1d∑p|dμ(p)f(dp)\ \ \ \ \ \ =\sum_{d|n}\frac{1}{d}\sum_{p|d}\mu(p)f(\frac{d}{p})
      =∑t|n∑p|nt1ptμ(p)f(t)\ \ \ \ \ \ =\sum_{t|n}\sum_{p|\frac{n}{t}}\frac{1}{pt}\mu(p)f(t)
      =∑t|nf(t)t∑p|ntμ(p)p\ \ \ \ \ \ =\sum_{t|n}\frac{f(t)}{t}\sum_{p|\frac{n}{t}}\frac{\mu(p)}{p}
根据容斥原理:φ(n)=∑d|nμ(d)∗nd根据容斥原理:\varphi(n)=\sum_{d|n}\frac{\mu(d)*n}{d}
所以∑p|ntμ(p)p=φ(nt)nt所以\sum_{p|\frac{n}{t}}\frac{\mu(p)}{p}=\frac{\varphi(\frac{n}{t})}{\frac{n}{t}}
ans=∑t|nf(t)tφ(nt)ntans=\sum_{t|n}\frac{f(t)}{t}\frac{\varphi(\frac{n}{t})}{\frac{n}{t}}
      =1n∑t|nf(t)φ(nt)\ \ \ \ \ \ =\frac{1}{n}\sum_{t|n}f(t)\varphi(\frac{n}{t})
现在我们只需要求出f(t)就行了。
设g[i][0]表示长度为i的开头和末尾相同的序列的个数,g[i][1]表示表示长度为i的开头和末尾不相同的序列的个数。
那么最后的答案f(n)=g[n][1]f(n)=g[n][1]。f表示的是一个和的形式,但是在求g[n][1]的过程中就已经统计过了长度是n的约数的序列的个数了。
比如在统计长度为6的时候,就会把1231231 2 3 1 2 3这种序列统计进去了。素以这样求是正确的。
g[i][0]=g[i−1][1]g[i][0]=g[i-1][1]
g[i][1]=(o−2)g[i][1]+(o−1)g[i−1][0]g[i][1]=(o-2)g[i][1]+(o-1)g[i-1][0]
         =(o−2)g[i][1]+(o−1)g[i−2][1]\ \ \ \ \ \ \ \ \ =(o-2)g[i][1]+(o-1)g[i-2][1]
所以f(n)=(o−2)f(n−1)+(o−1)f(n−2)所以f(n)=(o-2)f(n-1)+(o-1)f(n-2)
这个东西可以矩乘,也可以用特征根求通项。
r2=(o−2)r+(o−1)r^2=(o-2)r+(o-1)
解出来r1=−1,r2=d−1解出来r1=-1,r2=d-1
然后f(n)=c1∗r1n+c2∗r2nf(n)=c1*r1^n+c2*r2^n
可以把f(0)=0,f(1)=n∗(n−1)f(0)=0,f(1)=n*(n-1)带入就可以求出c1,c2c1,c2
解得c1=d−1,c2=1解得c1=d-1,c2=1
f(n)=(d−1)(−1)n+(d−1)nf(n)=(d-1)(-1)^n+(d-1)^n
直接dfs求出所有的约数算就可以了。
但是这个题vfk加强了数据!!!可能会有n是p的倍数的情况,也就是n没有逆元。怎么办呢?
因为xy%p=x%ypy\frac{x}{y}\%p=\frac{x\%yp}{y}
我们看要求的答案是∑t|nf(t)φ(nt)n%p\frac{\sum_{t|n}f(t)\varphi(\frac{n}{t})}{n}\%p用x代替∑\sum那么就是
ans=xn%p=xp%p2np%pans=\frac{x}{n}\%p=\frac{\frac{x}{p}\%p^2}{\frac{n}{p}}\%p

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define O 1000000007
#define LL long long
const int N=10000000;
bool flag[N+10];
LL o,n,ni,phi,six,D=1e9+7,p[N],ans,use[N];
int prime[N+10],u[N+10],T,m,mi[N];
inline void prepare(){int i,j;for(u[1]=1,i=2;i<=N;++i){if(!flag[i]){prime[++prime[0]]=i;u[i]=-1;}for(j=1;j<=prime[0]&&i*prime[j]<=N;++j){flag[i*prime[j]]=true;if(i%prime[j]==0){u[i*prime[j]]=0;break;}u[i*prime[j]]=-u[i];}}for(i=2;i<=N;++i) u[i]+=u[i-1];
}
inline LL quickmul(LL x,LL y){LL sum=0,v=1;if(y<0LL) y=-y,v=-1;while(y){if(y&1LL) sum=(sum+x)%D;y>>=1LL;x=(x+x)%D;}return sum*v;
}
inline LL quickpow(LL x,LL y){LL sum=1LL;while(y){if(y&1L) sum=quickmul(sum,x);y>>=1LL;x=quickmul(x,x);}return sum;
}
inline LL C(int x){return quickmul(quickmul(x,x-1),quickmul(x-2,six));
}
inline LL calc(){int i,j;LL sum=1,f,PHI=1;for(i=1;i<=p[0];++i)for(j=1;j<=use[i];++j) sum=sum*p[i];for(PHI=sum,i=1;i<=p[0];++i)if(use[i]) PHI=PHI/p[i]*(p[i]-1);sum=n/sum;f=(((o-1LL)*(LL)(sum%2?-1:1)+quickpow((LL)(o-1),sum))+D)%D;return quickmul(PHI,f);
}
inline void dfs(int x){int i;if(x==p[0]+1){ans=(ans+calc())%D;return ;}for(i=0;i<=mi[x];++i)use[x]=i,dfs(x+1);
}
int main(){prepare();scanf("%d",&T);while(T--){LL pre=O;D=O;int i,pos,mark=0;scanf("%lld%d",&n,&m);if(n%D) phi=D-1,ni=quickpow(n,D-2);else ni=quickpow(n/D,D-2),D=D*D,phi=quickmul(pre,pre-1),mark=1;six=quickpow(6LL,phi-1);for(o=0,i=1;i<=m;i=pos+1){pos=m/(m/i);o=(o+(quickmul((LL)(u[pos]-u[i-1]),C(m/i+2))+D)%D)%D;}LL x=n;for(p[0]=mi[0]=0,i=1;i<=prime[0]&&x>1LL;++i){if(x%prime[i]==0){p[++p[0]]=prime[i];mi[++mi[0]]=0;while(x%prime[i]==0){++mi[mi[0]];x/=prime[i];}}}if(x>1LL) p[++p[0]]=x,mi[++mi[0]]=1;ans=0;dfs(1);if(mark) ans/=pre;ans=quickmul(ans,ni);printf("%lld\n",ans%pre);}
}

[bzoj3202][SDOI2013]项链相关推荐

  1. bzoj3202:[Sdoi2013]项链

    思路:首先考虑如何求珠子个数,一个珠子由a,b,c三个数组成且属于区间[1,a],并满足gcd(a,b,c)=1.由于要求本质相同,对于a,b,c这样的一个无序的数列且满足gcd(a,b,c)=1,设 ...

  2. BZOJ 4330 JSOI2012 爱之项链

    Problem G: JSOI2012 爱之项链 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 13  Solved: 5 [Submit][Sta ...

  3. 【SDOI2013】项链【莫比乌斯反演】【Polya定理】【递推式求通项】【数论】

    题意:TTT 组数据,每组给定 n,an,an,a,求满足下列条件的项链数量: 有 nnn 个珠子. 每个珠子上有三个 [1,a]∩Z[1,a]\cap \Z[1,a]∩Z 的数,且三个数 gcd⁡\ ...

  4. 【SDOI2013 necklace】项链

    Description (JZOJ 3298) 有一个 n n颗珠子组成的项链 每颗珠子有3个面,可以写3个数字,数字的范围(0,a](0,a],两颗珠子是相同的当且仅当他们可以通过旋转变成一样 每颗 ...

  5. [SDOI2009]HH的项链

    题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断地收集新的贝壳,因此,他的项链 ...

  6. luogu P3306 [SDOI2013] 随机数生成器(BSGS,数列求通项,毒瘤特判)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 发个水题的 题解证明我还在() luogu P3306 [SDOI2013] 随机数生成器 Webli ...

  7. 【每日DP】day12、P1063 能量项链(区间DP又一模板,震惊,只需要4行代码?)难度⭐⭐⭐

    P1063 能量项链 本题(NOIP2006)和石子合并(NOI1999)几乎一模一样 垃圾NOIP抄袭NOI,手动狗头 但是还是有细微的区别的,首先你得先能看懂题,石子合并是N堆石子,是i−ki-k ...

  8. P1203 [USACO1.1]坏掉的项链Broken Necklace

    题目描述 你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的. 这里是 n=29 的二个例子: 第一和第二个珠子在图片中已经被作记号. 图片 A ...

  9. HLG 1376 能量项链

    题意: 给你一个 含有 n 个珠子的项链,规定只有相邻的珠子才能合到一起并得到能量,合到一起的到的新的珠子,可以和其相邻的珠子继续合成,前后次序没有要求, 问你最大能的到多大的能量: 分析  :用 d ...

  10. 可以预防新冠病毒的项链 -脉动

    这是一款来自于美国航空航天局( NASA )用于预防感染新冠病毒的坠饰,它通过检测你的手是否靠近你的面部,使用震动来提醒你不要触碰你的面部鼻子.嘴巴,不要揉眼睛等.这套硬件是一个开源的项目,发布在 G ...

最新文章

  1. music算法_“要热爱 请深爱”系列(5)浅谈模拟退火算法
  2. FTP的主动模式与被动模式
  3. VUE2第五天学习---自定义指令
  4. WPF and Silverlight 学习笔记(十九):WPF更换主题
  5. RportViewer(20121023) 参数引起的异常
  6. myPassword
  7. C++面试题-指针-动态内存指针
  8. 安卓为什么没有菊花进度条_全新软件首发,居然明目张胆的开车!支持ios+安卓,请务必低调使用!...
  9. Spark 广播变量BroadCast
  10. mysql基础之mariadb库管理和表管理语句
  11. 随心玩玩(一)易语言 大漠插件 制作脚本从入门到摔门而出(更完)
  12. Shiro 详细教程(集各教程内容为一体)
  13. 医院信息管理系统源码(含数据库脚本)
  14. Linux编程基础 5.2:消息队列
  15. c++11伪随机数生成库:random
  16. 计算机桌面图标乱码,电脑软件上的文字变乱码怎么办?怎么修复?
  17. 手机Root后如何拿取data/data目录下的文件夹到电脑上
  18. scanner——04scaner进阶
  19. EXCEL如何批量更改MAC地址格式?
  20. android查ip地址,Android 查看IP地址

热门文章

  1. ThinkPad安装ALPS驱动后任然关闭触摸板失败的解决方法
  2. 使用 matplotlib 绘制文氏图(venn)
  3. 07 Java 工程师面试技巧篇
  4. 嗅探器c语言源码,自己做的嗅探器
  5. mysql client_multi_statements_MySQL中CLIENT_MULTI_STATEMENTS的用法
  6. JavaEE Spring框架学习笔记(AOP Introductions介绍)
  7. 关于音频采样率,音频帧率,每次采集多少字节的理解
  8. 完美卸载Visual Studio2015的方法汇总
  9. cs服务器(cs索沛服务器)
  10. idm 2019 中文版下载