题目连接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3202

题意:一个项链由n个珠子组成。每个珠子有三个面,每个面上有一个数字,要求每个珠子三个面的数字的Gcd值为1。三个数排序后相同的算作一种,即珠子(1,3,4)和珠子(3,1,4)是一样的。每个面的数字范围为[1,a]。项链中相邻珠子不能相同,旋转后相同的算作一种。求不同的项链个数。模M=1e9+7。

思路:首先可以算出不同珠子的种类,容斥莫比乌斯啥的,设有m种。接下来设长度为n的项链满足相邻不一样的方案数,设为f(n),那么f(n)=f(n-1)*(m-2)+f(n-2)*(m-1)。这样答案为:

const i64 M1=1000000007;
const i64 M2=1000000014000000049;
const int N=10000005;

int prime[N],cnt,tag[N];
int mou[N];

void init()
{
    int i,j;
    for(i=2;i<N;i++)
    {
        if(!tag[i]) prime[cnt++]=i,mou[i]=-1;
        for(j=0;j<cnt&&(i64)i*prime[j]<N;j++)
        {
            tag[i*prime[j]]=1;
            if(i%prime[j]) mou[i*prime[j]]=-mou[i];
            else
            {
                mou[i*prime[j]]=0;
                break;
            }
        }
    }
    mou[1]=1;
}

i64 n,a,mod;

i64 mul(i64 x,i64 y)
{
    x%=mod;
    i64 ans=0;
    if(y<0) x=-x,y=-y;
    while(y)
    {
        if(y&1) ans=(ans+x)%mod;
        x=(x+x)%mod;
        y>>=1;
    }
    if(ans<0) ans+=mod;
    return ans;
}

i64 C2(i64 x)
{
    if(x<2) return 0;
    return x*(x-1)/2%mod;
}

i64 C3(i64 x)
{
    if(x<3) return 0;
    i64 a=x,b=x-1,c=x-2;
    if(a%2==0) a>>=1;
    else b>>=1;

    if(a%3==0) a/=3;
    else if(b%3==0) b/=3;
    else c/=3;

    return mul(mul(a,b),c);
}

i64 cal()
{
    i64 ans=1;
    int i;
    for(i=1;i<=a;i++) if(mou[i])
    {
        ans+=mou[i]*C2(a/i)*2;
        ans%=mod;
        ans+=mou[i]*C3(a/i);
        ans%=mod;
    }
    return ans;
}

i64 myPow(i64 x,i64 y)
{
    i64 ans=1;
    while(y)
    {
        if(y&1) ans=mul(ans,x);
        x=mul(x,x);
        y>>=1;
    }
    return ans;
}

i64 m;

i64 eular(i64 x)
{
    i64 i;
    i64 ans=x;
    for(i=0;i<cnt&&(i64)prime[i]*prime[i]<=x;i++) if(x%prime[i]==0)
    {
        ans-=ans/prime[i];
        while(x%prime[i]==0) x/=prime[i];
    }
    if(x>1) ans-=ans/x;
    return ans;
}

i64 f(i64 n)
{
    if(n%2==0) return (myPow(m-1,n)+(m-1))%mod;
    return (myPow(m-1,n)-(m-1))%mod;
}

int main()
{
    init();
    int T=getInt();
    while(T--)
    {
        n=getInt();
        a=getInt();

        if(n%M1==0) mod=M2;
        else mod=M1;

        m=cal();

        i64 ans=0;
        int i;
        for(i=1;(i64)i*i<=n;i++) if(n%i==0)
        {
            ans+=mul(f(i),eular(n/i));
            ans%=mod;
            if(n/i!=i) ans+=mul(f(n/i),eular(i));
            ans%=mod;
        }
        if(mod==M1) ans=mul(ans,myPow(n%mod,mod-2));
        else
        {
            mod=M1;
            ans=ans/mod*myPow(n/mod,mod-2)%mod;
        }

        if(ans<0) ans+=mod;
        printf("%lld\n",ans);
    }
}

BZOJ 3202 项链的更多相关文章

  1. bzoj 3202: [Sdoi2013]项链

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

  2. 洛谷 P3307: bzoj 3202: [SDOI2013] 项链

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

  3. bzoj 3202 [Sdoi2013]项链——容斥+置换+推式子

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

  4. bzoj 3202 [Sdoi 2013] 项链 —— 置换+计数

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3202 参考了博客: https://www.cnblogs.com/zhoushuyu/p/ ...

  5. 【BZOJ】【1878】【SDOI2009】HH的项链

    树状数组/前缀和 Orz lct1999 好神的做法... 先看下暴力的做法:对于区间[l,r],我们依次扫过去,如果这个数是第一次出现,那么我们种类数+1. 我们发现:区间中相同的几个数,只有最左边 ...

  6. 【BZOJ】【3790】神奇项链

    Manacher算法/DP 找出所有的回文串,看做是一个个线段,那么问题就转化成了用最少的线段将整个区间覆盖起来,可以重叠,那么这就是一个DP了= = Orz ZKY大爷,让蒟蒻开眼界了……头一次知道 ...

  7. BZOJ 3790 神奇项链 hash/后缀自动机+贪心

    Description 母亲节就要到了,小 H 准备送给她一个特殊的项链.这个项链可以看作一个用小写字母组成的字符串,每个小写字母表示一种颜色. 为了制作这个项链,小 H 购买了两个机器.第一个机器可 ...

  8. bzoj 4330: JSOI2012 爱之项链

    听说这题不公开.. 那就不贴题意了 首先要用burnside引理求出戒指的种数,那么对于一个顺时针旋转$k$个位置的置换就相当于连上一条$(i,(i+k)%R)$的边,每个环颜色必须相同 环的个数为$ ...

  9. BZOJ 1878: [SDOI2009]HH的项链

    1878: [SDOI2009]HH的项链 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 3548  Solved: 1757[Submit][Statu ...

随机推荐

  1. JVM中启用逃逸分析

    -XX:+DoEscapeAnalysis 逃逸分析优化JVM原理我们知道java对象是在堆里分配的,在调用栈中,只保存了对象的指针.当对象不再使用后,需要依靠GC来遍历引用树并回收内存,如果对象数量 ...

  2. 夺命雷公狗---DEDECMS----22dedecms让A标签进入对应的内容页

    我们的模版里的超链接都是写死的,这都是不符合实际网站的需求的,我们要将他让他边活的,而并非死的.. 我们首先要将前端给我们的内容页面的模版放到目标目录里面,但是我们的内容页的模版名叫啥呢?我们可以来查 ...

  3. java小程序整理及排序算法

    1. 利用循环打印如下图形 ***** **** *** ** * public class Main { public static void main(String[] args) { // TO ...

  4. win7 dos命令窗口内容显示不全解决办法--将命令执行结果输出到一个文件中

    执行命令:命令 >>某某路径\文件全名

  5. iOS 学习笔记 二 (2015.02.26)

    How To Use Git Source Control with Xcode in iOS 6 If you're new here, you may want to subscribe to m ...

  6. 虚拟机 本地 本机 双启动 运行 vhd local Dual Boot

    在使用虚拟机的过程中, 可能会遇到虚拟机的运行要求过高, 电脑力不从心的情况. 为了让虚拟机使用更多电脑资源, 可以让虚拟机以本地双系统的方式,访问本地计算机资源. 打开磁盘管理,在磁盘上右键,选择 ...

  7. Caused by: org.hibernate.HibernateException: Connection cannot be null when 'hibernate.dialect' not set

    docs.jboss.org文档示例代码:(http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/) sta ...

  8. VC中常用的宏

        我们在VS环境中开发的时候,会遇到很多宏定义,这些宏可以应用到代码中,或用于编译.工程选项等设置,总之是我们开发中必不可少的工具,有必要做一个总结.有些宏是C/C++定义的,有些宏是VC环境预 ...

  9. Windows驱动开发(中间层)

    Windows驱动开发 一.前言 依据<Windows内核安全与驱动开发>及MSDN等网络质料进行学习开发. 二.初步环境 1.下载安装WDK7.1.0(WinDDK\7600.16385 ...

  10. html+css复习之第2篇 | javascript

    1. java 中定义数组和对象: 数组(Array)字面量 定义一个数组: [40, 100, 1, 5, 25, 10] 对象(Object)字面量 定义一个对象: {firstName:&quo ...