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 

Solution

丧心病狂的数论二合一题。。

可以分成两部分来考虑,珠子的种类数和组成环的方案数。


珠子的种类数

设\(s_3\)为最多三元环的种类数,即:
\[ s_3=\sum_{i=1}^a\sum_{j=1}^a\sum_{k=1}^a[\gcd(i,j,k)=1] \]
\(s_2,s_1\)依次类推,即:
\[ s_2=\sum_{i=1}^a\sum_{j=1}^a[\gcd(i,j)=1],s_1=1 \]
可以容斥得到:

总种类数\(=1+(3s_2-3)/3+(s_3-(3s_2-3)-1)/6=(s_3+3s_2+2)/6.\)

然后莫比乌斯反演求一下\(s\)就行了,式子:
\[ s_3=\sum_{d=1}^a\mu(d)\lfloor\frac{a}{d}\rfloor^3,s_2=\sum_{d=1}^a\mu(d)\lfloor\frac{a}{d}\rfloor^2 \]


环的方案数

设先前求出来的方案数为\(m\)。

看到环旋转前后属于同一种方案,可以想到\(polya\)定理:
\[ ans=\sum_{i=1}^{n}f(\gcd(n,i))=\sum_{d|n}\varphi(\frac{n}{d})f(d)=\sum_{d|n}\varphi(d)f(\frac{n}{d}) \]
由于有限制:相邻的颜色不同,设\(f(n)\)为\(n\)个点的环满足条件的涂色方案,则有:
\[ f(n)=(m-2)f(n-1)+(m-1)f(n-2) \]
这个式子可以理解为:枚举一个合法方案的断点,两边颜色一定不同,这时候要么当前方案是由\((n-1)\)个点组成的,只有\((m-2)\)种颜色可选,要么由\((n-2)\)个点组成的,加一个与一边相同的点,然后只有\((m-1)\)中颜色选。

然后发现这是一个二阶齐次线性方程,可以搬出特征方程的套路,设这是一个等比数列,可得特征方程:
\[ x^2=(m-2)x+m-1 \]
解得:
\[ x_1=m-1,x_2=-1 \]
设当前数列通项公式为:
\[ f(n)=\alpha x_1^n+\beta x_2^n \]
由于:
\[ f(1)=0,f(2)=m^2-m \]
列出方程:
\[ \begin{cases} \alpha(m-1)-\beta=0\\ \alpha(m-1)^2+\beta=m^2-m \end{cases} \]
解得\(\alpha=1,\beta=m-1\),所以\(f\)的通项公式为:
\[ f(n)=(m-1)^n+(-1)^n(m-1) \]
答案是:
\[ \sum_{d|n}\varphi(\frac{n}{d})f(d) \]
所以直接一路暴力就好了。

记得\(long\,\,long\)会乘爆,用爆\(long\,\,long\)小技巧就好了,具体看代码\(mul\)函数。

由于\(n\)有可能是\(1e9+7\)的倍数,所以特判下,如果是就模\((1e9+7)^2\),最后除掉\(1e9+7\)即可。

然后细节还有挺多的,,注意下写法,不然调试很恶心。

#include<bits/stdc++.h>
using namespace std;#ifdef ONLINE_JUDGE
#define getchar() ((p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin)),p1==p2)?EOF:*p1++)
#endifnamespace fast_IO {char buf[1<<21],*p1=buf,*p2=buf;template <typename T> inline void read(T &x) {x=0;T f=1;char ch=getchar();for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;}template <typename T,typename... Args> inline void read(T& x,Args& ...args) {read(x),read(args...);}char buf2[1<<21],a[80];int p,p3=-1;inline void flush() {fwrite(buf2,1,p3+1,stdout),p3=-1;}template <typename T> inline void write(T x) {if(p3>(1<<20)) flush();if(x<0) buf2[++p3]='-',x=-x;do {a[++p]=x%10+48;} while(x/=10);do {buf2[++p3]=a[p];} while(--p);buf2[++p3]='\n';}template <typename T,typename... Args> inline void write(T x,Args ...args) {write(x),write(args...);}
}using fast_IO :: read;
using fast_IO :: write;
using fast_IO :: flush;#define sqr(x) mul(x,x)
#define cul(x) mul(sqr(x),x)#define ll long long
#define lf long double
#define ull unsigned long longconst int maxn = 1e7+10;
const int MOD = 1e9+7;
const int MAXN = 1e4+10;ll mod;int pri[maxn],vis[maxn],mu[maxn],tot;void sieve(int N) {mu[1]=1;for(int i=2;i<=N;i++) {if(!vis[i]) pri[++tot]=i,mu[i]=-1;for(int j=1;j<=tot&&i*pri[j]<=N;j++) {vis[i*pri[j]]=1;if(i%pri[j]==0) break;mu[i*pri[j]]=-mu[i];}}for(int i=1;i<=N;i++) mu[i]+=mu[i-1];
}ll mul(ll a,ll b) {lf res=(lf)a*b/mod;ll t=a*b,t2=(t-(ull)res*mod+mod)%mod;return t2;
}ll qpow(ll a,ll x) {ll res=1;for(;x;x>>=1,a=mul(a,a)) if(x&1) res=mul(res,a);return res;
}ll a[MAXN],p[MAXN],cnt;ll m,ans,inv6,nown;void mobius(int n) {m=0;int T=1;while(T<=n) {int pre=T;T=n/(n/T);m=(m+1ll*mul((mu[T]-mu[pre-1]),cul(n/T)))%mod;m=(m+1ll*mul((mu[T]-mu[pre-1]),sqr(n/T))*3ll%mod)%mod;T++;}m=(m+2)%mod;m=mul(m,inv6)%mod;
}void prepare(ll n) {cnt=0;for(int i=2;1ll*i*i<=n;i++) {if(n%i) continue;a[++cnt]=i;p[cnt]=0;while(n%i==0) n/=i,p[cnt]++;}if(n!=1) a[++cnt]=n,p[cnt]=1;
}ll f(ll n) {ll Ans=qpow(m-1,n);if(n&1) Ans=(Ans+mod-m+1)%mod;else Ans=(Ans+m-1)%mod;return Ans;
}void polya(int now,ll d,ll phi) {if(now==cnt+1) return ans=(ans+mul(phi,f(nown/d)))%mod,void();polya(now+1,d,phi);d*=a[now],phi*=a[now]-1;polya(now+1,d,phi);for(int i=2;i<=p[now];i++)d*=a[now],phi*=a[now],polya(now+1,d,phi);
}ll inn[20],ina[20],mx,inv[10];void pre_inv() {inv[1]=1;for(int i=2;i<=6;i++) inv[i]=mul(mod-mod/i,inv[mod%i]);inv6=inv[6];
}int main() {int t;read(t);for(int i=1;i<=t;i++) read(inn[i],ina[i]),mx=max(mx,ina[i]);sieve(mx);for(int i=1;i<=t;i++) {nown=inn[i];if(inn[i]%MOD) mod=MOD;else mod=1ll*MOD*MOD;pre_inv();mobius(ina[i]);prepare(inn[i]);ans=0;polya(1,1,1);if(inn[i]%MOD) ans=mul(ans,qpow(inn[i],mod-2));else ans=mul(ans/MOD,qpow(inn[i]/MOD,MOD-2))%MOD;write(ans);}flush();return 0;
}

转载于:https://www.cnblogs.com/hbyer/p/10211167.html

[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. Android开发权威指南(第2版)新书发布
  2. Linux内核中流量控制(16)
  3. Spring源码解析:自定义标签的解析过程
  4. Steeltoe 2.4新增代码生成工具、全新入门指南等,助力.NET微服务开发
  5. 面向对象(OOP)基本概念
  6. [CareerCup] 3.5 Implement Queue using Two Stacks 使用两个栈来实现队列
  7. JavaScript 存储Cookie
  8. php打印出网站源码/php数据压缩代码
  9. 常用工具下载及在线地址
  10. 做数据分析的女孩子,职业发展在哪?数据分析枯燥吗?
  11. 计算机视觉知识点-车型识别
  12. java升职之路_初级Java程序员的发展及晋升之路
  13. Unity | 安卓 读取和写入TXT文本操作
  14. pyserial库是python语言用于,python的pyserial模块
  15. 朋友python多个逻辑条件判断_Python小课笔记--Python控制流:if逻辑判断
  16. 爬虫剑谱第七页(输入关键词爬取拼多多商品信息并进行保存)
  17. 《程序员的职业修养》读后感(一):专业主义
  18. excel表格合并程序
  19. DEEPIN系统安装各个版本的R语言
  20. 智慧仓储:打造仓储管理一张图

热门文章

  1. Dual-edge triggered flip_flop(Dualedge)
  2. 移除superView上的subviews
  3. 为什么计算机专业的学生要学习使用 Linux 系统?
  4. 强烈呼吁弃用Notepad++,推荐几款优秀替代品
  5. Windows 窗口层次关系
  6. 【戴师兄数分】excel基础操作——函数专题(个人笔记)
  7. 博弈论:子博弈精炼均衡(子博弈都是纳什均衡,比纳什均衡更强的概念)
  8. Python自动连接网络(自动登录网络准入系统)
  9. nginx 499错误原因及解决
  10. 理解 Roslyn 中的红绿树(Red-Green Trees)