SPOJ 422 Transposing is Even More Fun ——Burnside引理
这题目就比较有趣了。
大概题目中介绍了一下计算机的储存方法,给一个$2^a*2^b$的矩阵。
求转置。但是只能交换两个数,求所需要的步数。
首先可以把变化前后的位置写出来,构成了许多的循环。左转将狼踩尽博客
然后就是求循环的个数了。
发现循环都是左移形成的,可以直接计算本质不同的串的个数。
(这里用到一个小优化,把最小的循环节找出来可以简化问题,这样子可以变成循环任意多次,就能用欧拉函数了)
然后就是一顿模板 (POJ2154)
然后交上去
TLE。
SPOJ太慢了
1s跑不过40w的$nsqrt(n)$
然后把2的幂次预处理出来,然后吧逆元线性递推。还是TLE。
然后去看别人的博客,讲了一种奇怪的做法,然而我并没有看懂是什么情况。
也没有任何人讲到。
那看看算法主体中哪些地方还可以优化。
然后怒用调和级数处理因子,然后把vector换成了邻接表,然后A掉了。
#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define maxn 1000005
int pri[maxn],top,phi[maxn],vis[maxn];
int pw[maxn<<2],inv[maxn]; #define ll long long
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i) int h[maxn*20],to[maxn*20],ne[maxn*20],en=0; void add(int a,int b)
{
to[en]=b;ne[en]=h[a];h[a]=en++;
} inline char nc(){
static char buf[100000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline void read(int &x){
char c=nc(),b=1;
for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1;
for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b;
} int t,a,b,d,c,p=1000003,e; void Shaker()
{
phi[1]=1;
F(i,2,maxn-1)
{
if (!vis[i]) pri[++top]=i,phi[i]=i-1;
for (int j=1;j<=top&&(ll)i*pri[j]<maxn;++j)
{
vis[i*pri[j]]=1;
if (i%pri[j]==0){phi[i*pri[j]]=phi[i]*pri[j];break;}
phi[i*pri[j]]=phi[i]*phi[pri[j]];
}
}
inv[1]=1; F(i,2,maxn-1) inv[i]=(p-(ll)p/i*inv[p%i])%p;
pw[0]=1;
F(i,1,(maxn<<2)-1) pw[i]=pw[i-1]*2%p;
F(i,1,maxn-1)
for (int j=i;j<maxn;j+=i)
add(j,i);
} int ksm(int a,int b)
{
int ret=1;
for (;b;b>>=1,a=(ll)a*a%p) if (b&1) ret=(ll)ret*a%p;
return ret;
} int gcd(int a,int b)
{return b==0?a:gcd(b,a%b);} int main()
{
memset(h,-1,sizeof h);
Shaker();
read(t);
while(t--)
{
int ans=0;
read(a);read(b);
if (a*b==0) {printf("0\n");continue;}
d=gcd(a,b); c=a+b; c=c/d; e=pw[d];
for (register int i=h[c];i>=0;i=ne[i])
ans=(ans+(ll)phi[c/to[i]]*pw[d*to[i]]%p)%p;
ans=(ll)ans*inv[(a+b)/d]%p;
printf("%d\n",((pw[c*d]-ans)%p+p)%p);
}
}
SPOJ 422 Transposing is Even More Fun ——Burnside引理的更多相关文章
- SPOJ 422 Transposing is Even More Fun(polay计数)
题目链接:http://www.spoj.com/problems/TRANSP2/ 题意: 思路:不妨设a=1,b=2, 我们发现(001,010,100)组成一个置换,(011,110,101)组 ...
- 解题:SPOJ 422 Transposing is Even More Fun
题面 这种换来换去的东西很容易想到置换群那一套,然后题目甚至还暗示了二进制=.= 直接换的话显然是$2^{a+b}$次,但是一个循环节里可以少换一次,然后问题就变成了数循环节 在一个循环节里的位置有什 ...
- [bzoj 1004][HNOI 2008]Cards(Burnside引理+DP)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1004 分析: 1.确定方向:肯定是组合数学问题,不是Polya就是Burnside,然后题目上 ...
- POJ 2888 Magic Bracelet(Burnside引理,矩阵优化)
Magic Bracelet Time Limit: 2000MS Memory Limit: 131072K Total Submissions: 3731 Accepted: 1227 D ...
- BZOJ 1004 Cards(Burnside引理+DP)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1004 题意:三种颜色的扑克牌各有Sr,Sb,Sg张.给出m种置换.两种染色方案在某种置换 ...
- BZOJ_[HNOI2008]_Cards_(置换+Burnside引理+乘法逆元+费马小定理+快速幂)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1004 共n个卡片,染成r,b,g三种颜色,每种颜色的个数有规定.给出一些置换,可以由置换得到的 ...
- [BZOJ 1004] [HNOI2008] Cards 【Burnside引理 + DP】
题目链接:BZOJ - 1004 题目分析 首先,几个定义和定理引理: 群:G是一个集合,*是定义在这个集合上的一个运算. 如果满足以下性质,那么(G, *)是一个群. 1)封闭性,对于任意 a, b ...
- BZOJ 1004: [HNOI2008]Cards( 置换群 + burnside引理 + 背包dp + 乘法逆元 )
题意保证了是一个置换群. 根据burnside引理, 答案为Σc(f) / (M+1). c(f)表示置换f的不动点数, 而题目限制了颜色的数量, 所以还得满足题目, 用背包dp来计算.dp(x,i, ...
- BZOJ 1004 HNOI2008 Cards Burnside引理
标题效果:特定n张卡m换人,编号寻求等价类 数据保证这m换人加上置换群置换后本身构成 BZOJ坑爹0.0 条件不那么重要出来尼玛怎么做 Burnside引理--昨晚为了做这题硬啃了一晚上白书0.0 都 ...
随机推荐
- oracle安装报错[INS-30131]执行安装程序验证所需的初始设置失败(无法访问临时位置)解决方法!
最近在电脑上安装oracle12c,安装时,在执行检查环境步骤时候报错: [INS-30131]执行安装程序验证所需的初始设置失败(无法访问临时位置) 最后在网上搜索解决方法,特记录下,以防以后再用到 ...
- IPython安装过程 @win7 64bit
http://www.360doc.com/content/14/0902/11/16740871_406476389.shtml 为了测验测验一下IPython的应用,今天折腾了好久的从安装包msi ...
- 对mysql快速批量修改,查重
更新UPDATE mytable SET myfield = CASE id WHEN 1 THEN 'value' WHEN 2 THEN 'value' WHEN 3 THEN 'value' E ...
- form中 单选框 input[type="radio"] 分组
在form中有时候需要给单选框分组,这种情况下 可以通过给单选框设置相同的name来进行分组: <html> <head> <title> </title&g ...
- mybatis的优缺点及应用场合
mybatis框架的优点 与jdbc相比,减少了50%以上的代码量 mybatis是最简单的持久化框架,小巧简单且易学 mybatis想到灵活,不会对应用程序或者数据库的现有设计强加任何影响,SQL写 ...
- php+croppic.js实现剪切上传图片
最近需要实现裁剪图片上传,想起之前公司用到的一个插件,却不知道叫什么名字了. 在网上找了有些时间,最终找到了这个网站. http://www.croppic.net/ 因为官网文档全部都是英文,所以看 ...
- JS — 实现简单的数字时钟
js实现简单的数字时钟 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> & ...
- 面试前赶紧看了5道Python Web面试题,Python面试题No17
目录 本面试题题库,由公号:非本科程序员 整理发布 第1题: Flask中的请求上下文和应用上下文是什么? 第2题:django中间件的使用? 第3题: django开发中数据做过什么优化? 第4题: ...
- mem_init()
原本由bootmem管理的内存在mem_init函数中交由伙伴系统管理. 1.free_unused_memmap_node 相邻的membank间可能存在空洞,但在bootmem阶段这些空洞页也分配 ...
- Hive将SQL转化为MapReduce的过程
Hive将SQL转化为MapReduce的过程: Antlr定义SQL的语法规则,完成SQL词法,语法解析,将SQL转化为抽象语法树AST Tree 遍历AST Tree,抽象出查询的基本组成单元Qu ...