【HDU2865】Birthday Toy-Burnside引理+数论+DP矩阵优化
来源:互联网 发布:师洋的淘宝店号是多少 编辑:程序博客网 时间:2024/06/15 17:21
测试地址:Birthday Toy
题目大意:要给一种轮状玩具着色,这种轮状玩具外围是环形的,由
做法:这一道题需要使用:Burnside引理,欧拉函数,DP+矩阵快速幂优化,乘法逆元。
这一道题大体和POJ2888类似,都限定了相邻珠子的颜色,不同的是这一题限制变得更有规律了,但是
首先大珠子可以涂任意一种颜色,然后小珠子只能涂剩下的颜色了,为了方便,接下来我们令
在这一题里,矩阵
我们可以找到一个规律:
其中
其实好像还有更简单的递推式,但是我使用了更简单粗暴的分析方法,大家就将就着看吧……
那么很显然这个递推式就可以使用矩阵加速优化了,其余的关于利用欧拉函数优化计算Burnside公式的时间复杂度等内容和POJ2888相同,上文已经给了链接,这里就不赘述了。注意负数取模。
犯二的地方:
以下是本人代码:
#include <cstdio>#include <cstdlib>#include <cstring>#include <iostream>#include <algorithm>#define ll long long#define mod 1000000007using namespace std;ll N,K,ans;struct matrix {ll s[2][2];} M[40];void exgcd(ll a,ll b,ll &x,ll &y){ ll x0=1,x1=0,y0=0,y1=1; while(b) { ll tmp,q; q=a/b; tmp=x0,x0=x1,x1=tmp-q*x1; tmp=y0,y0=y1,y1=tmp-q*y1; tmp=a,a=b,b=tmp%b; } x=x0,y=y0;}matrix mult(matrix A,matrix B){ matrix S; memset(S.s,0,sizeof(S.s)); for(int i=0;i<=1;i++) for(int j=0;j<=1;j++) for(int k=0;k<=1;k++) S.s[i][j]=(S.s[i][j]+A.s[i][k]*B.s[k][j])%mod; return S;}matrix power(ll x){ matrix S; S.s[0][0]=1,S.s[0][1]=0; S.s[1][0]=0,S.s[1][1]=1; int i=0; while(x) { if (x&1) S=mult(S,M[i]); i++;x>>=1; } return S;}ll phi(ll x){ ll s=x; for(ll i=2;i*i<=x;i++) if (!(x%i)) { s=s/i*(i-1); while(!(x%i)) x/=i; } if (x>1) s=s/x*(x-1); return s;}void solve(ll x){ matrix S=power(x/2); ll tmp=S.s[0][0]+S.s[0][1]; if (x%2) tmp=((K-1)*((tmp-1)%mod))%mod; tmp=(K*tmp)%mod; tmp=(phi(N/x)*tmp)%mod; ans=(ans+tmp)%mod;}int main(){ while(scanf("%lld%lld",&N,&K)!=EOF) { ans=0; K--; M[0].s[0][0]=((K-1)*(K-1))%mod; M[0].s[0][1]=((-(K-1)*(K-2))%mod+mod)%mod; M[0].s[1][0]=0; M[0].s[1][1]=1; for(int i=1;i<=35;i++) M[i]=mult(M[i-1],M[i-1]); for(ll i=1;i*i<=N;i++) if (!(N%i)) { solve(i); if (i!=N/i) solve(N/i); } ll x0,y0; exgcd(N,mod,x0,y0); x0=(x0%mod+mod)%mod; printf("%lld\n",(((x0*ans)%mod)*(K+1))%mod); } return 0;}
- 【HDU2865】Birthday Toy-Burnside引理+数论+DP矩阵优化
- 【POJ2888】Magic Bracelet-Burnside引理+数论+DP矩阵优化
- [HDU2865]Birthday Toy(置换群+dp+矩乘)
- 【hdu2481】Toy,burnside引理+矩阵乘法
- 【HDU2865】构造矩阵+Burnside定理+欧拉函数类似poj2888
- HDU 2865 Birthday Toy(Polya+矩阵乘法+dp)
- hdu 2865 Birthday Toy (置换+DP+矩阵乘法)
- HDU2481:Toy(Burnside)
- hdu 2481 Birthday Toy
- Birthday Toy HDU
- 【bzoj1010】玩具装箱toy 斜率优化dp
- HNOI2008玩具装箱Toy 斜率优化DP
- [BZOJ1004][HNOI2008][Burnside引理][DP]Cards
- 【bzoj1004】[HNOI2008]Cards burnside引理+dp
- HDU 2865 Birthday Toy polya 矩阵快速幂 欧拉函数
- Burnside引理
- 【burnside引理】
- Burnside引理
- 151. Reverse Words in a String
- 20、不一样的C++系列--操作符重载
- 【C++】【LeetCode】38. Count and Say
- ifstream读取数据块例程
- 制作风格——百变幻灯片,完全DIY(高级教程)
- 【HDU2865】Birthday Toy-Burnside引理+数论+DP矩阵优化
- STM32-串口通信printf重定向
- nginx源码浅析--主流程
- 主流浏览器密码获取-WebBrowserPassView二次开发
- Android中使用Spinner来实现图标文字并存的二级联动
- android Edittext 设置行间距
- Ubuntu操作系统下Pixhawk原生固件PX4的编译方法
- Hdu2162 Add ‘em
- Java中方法的重写(override)和重载(overload)的使用规则总结: