当前位置: 首页 > news >正文

SPOJ 422 Transposing is Even More Fun(polay计数)

题目链接:http://www.spoj.com/problems/TRANSP2/

题意:

思路:不妨设a=1,b=2,

我们发现(001,010,100)组成一个置换,(011,110,101)组成一个置换。那么对于同一个置换中元素,设置换大小为x,则需要x-1次交换。因此,我们若找到循环节的个数K,那么答案即为2^(a+b)-K.

a+b个珠子的项链,每个珠子可以用两种颜色涂色,通过每次左移a个珠子得到的相同的视为相同。求不同项链的个数。问题就转化成这个。设g=Gcd(a,a+b),则置换群个数为G=(a+b)/g。其实可以看做有G个珠子,每个珠子可以用2^g种颜色涂色。答案为:

 

int a,b,Pow[N],phi[N];
int prime[1005],tag[1005],cnt;


void init()
{
    Pow[0]=1;
    int i,j;
    for(i=1;i<N;i++) Pow[i]=Pow[i-1]*2%mod;

    phi[1]=1;
    for(i=2;i<N;i++) if(!phi[i]) for(j=i;j<N;j+=i)
    {
        if(!phi[j]) phi[j]=j;
        phi[j]=phi[j]/i*(i-1);
    }

    for(i=1;i<N;i++) phi[i]%=mod;

    for(i=2;i<=1000;i++) if(!tag[i])
    {
        prime[cnt++]=i;
        for(j=i+i;j<=1000;j+=i) tag[j]=1;
    }
}

int Gcd(int x,int y)
{
    if(y==0) return x;
    return Gcd(y,x%y);
}


i64 exGcd(int a,int b,i64 &x,i64 &y)
{
    if(b==0)
    {
        x=1;
        y=0;
        return a;
    }
    i64 temp=exGcd(b,a%b,x,y);
    i64 t=x;
    x=y;
    y=t-a/b*y;
    return temp;
}

int p[105],q[105],num;

void split(int n)
{
    num=0;
    int i;
    for(i=0;i<cnt&&prime[i]*prime[i]<=n;i++) if(n%prime[i]==0)
    {
        p[num]=prime[i];
        q[num]=0;
        while(n%prime[i]==0)
        {
            q[num]++;
            n/=prime[i];
        }
        num++;
    }
    if(n>1) p[num]=n,q[num++]=1;
}


int ans,m,L;

int calPow(int a,int b)
{
    int ans=1;
    while(b)
    {
        if(b&1) ans=(i64)ans*a%mod;
        a=(i64)a*a%mod;
        b>>=1;
    }
    return ans;
}

void cal(int t)
{
    int x=L/t;
    ans+=(i64)calPow(m,t)*phi[x]%mod;
    ans%=mod;
}

void DFS(int dep,int t)
{
    if(dep==num)
    {
        cal(t);
        return;
    }
    int i;
    for(i=0;i<=q[dep];i++)
    {
        DFS(dep+1,t);
        t*=p[dep];
    }
}

int main()
{
    init();
    rush()
    {
        RD(a,b);
        if(!a||!b)
        {
            puts("0");
            continue;
        }
        b+=a;
        int k=Gcd(a,b);
        L=b/k;
        split(L); ans=0; m=Pow[k];
        DFS(0,1);
        i64 x,y;
        exGcd(L,mod,x,y);
        x=(x%mod+mod)%mod;
        ans=ans*x%mod;
        ans=Pow[b]-ans;
        ans=(ans%mod+mod)%mod;
        PR(ans);
    }
}

  

 

相关文章:

  • DevExpress.9.2.9 破解文件
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • 071:【Django数据库】ORM聚合函数详解-Avg
  • 自定义函数
  • 用户体验为什么重要?如何提升产品的用户体验?(写给产品小白)
  • 如何编写一个可升级的智能合约
  • disruptor 核心概念 二
  • 线程池-线程池源码详解
  • Java总结 - String - 这篇请使劲喷我
  • 星舆科技:打造下一代定位技术 以高精度位置感知构筑AI+时代基础力量
  • Spring配置报错- 元素 'beans' 必须不含字符 [子级]
  • tomcat如何修改发布目录
  • bootstrap网站后台从设计到开发
  • 企业分布式微服务云SpringCloud SpringBoot mybatis (十二)断路器监控(Hystrix Dashboard)...
  • XML已死 ?
  • @jsonView过滤属性
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 3.7、@ResponseBody 和 @RestController
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • Druid 在有赞的实践
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • JSDuck 与 AngularJS 融合技巧
  • JS笔记四:作用域、变量(函数)提升
  • mongo索引构建
  • PaddlePaddle-GitHub的正确打开姿势
  • React系列之 Redux 架构模式
  • Web Storage相关
  • 程序员该如何有效的找工作?
  • 搞机器学习要哪些技能
  • 如何实现 font-size 的响应式
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ​iOS实时查看App运行日志
  • ​业务双活的数据切换思路设计(下)
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #mysql 8.0 踩坑日记
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • $jQuery 重写Alert样式方法
  • (26)4.7 字符函数和字符串函数
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (接口自动化)Python3操作MySQL数据库
  • (七)c52学习之旅-中断
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • .NET Core 中的路径问题
  • .NET NPOI导出Excel详解
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • .NET中GET与SET的用法
  • @transaction 提交事务_【读源码】剖析TCCTransaction事务提交实现细节
  • @拔赤:Web前端开发十日谈
  • [120_移动开发Android]008_android开发之Pull操作xml文件
  • [2]十道算法题【Java实现】
  • [20190401]关于semtimedop函数调用.txt
  • [23] 4K4D: Real-Time 4D View Synthesis at 4K Resolution
  • [AIGC] 使用Curl进行网络请求的常见用法