总的来说,这题要2次用到polya定理。

由题目条件A*A=B*B+1,变形为(A-1)*(A+1)=K*B*B;

分别分解A-1和A+1的质因数,在合并在一起。

第一步:搜索B,对B*B的正方形涂色,基本的polya定理搞定,即C^(B*B)+C^((B*B+1)/2)+2*C^((B*B+3)/4).

第二步:搜索K,在A-1和A+1的因子中搜索,这样不会超时,在用polya定理,最后在结果上乘C就可以了……

 

  1 #include<iostream>
2 #include<stdio.h>
3 #include<algorithm>
4 #include<iomanip>
5 #include<cmath>
6 #include<string>
7 #include<vector>
8 using namespace std;
9 const long mod=1000000007;
10 int prime[40003],m,fac[1000][2],flen;
11 vector<int> v;
12 bool f[40003];
13 __int64 A,C,ans,ret_A,inverse_4,inverse_k;
14 void init()
15 {
16 __int64 i,j;
17 m=0;
18 for(i=2;i<=40000;i++)
19 if(f[i]==0)
20 {
21 prime[m++]=i;
22 for(j=i*i;j<=40000;j+=i)
23 f[j]=1;
24 }
25 }
26 __int64 extend_gcd(__int64 a,__int64 b,__int64 &x,__int64 &y)
27 {
28 __int64 d;
29 if(b==0)
30 {
31 x=1;y=0;
32 return a;
33 }
34 else
35 {
36 d=extend_gcd(b,a%b,x,y);
37 __int64 temp=x;
38 x=y;
39 y=temp-a/b*y;
40 }
41 return d;
42 }
43 __int64 pows(__int64 a,__int64 b)
44 {
45 __int64 ans=1;
46 a%=mod;
47 while(b)
48 {
49 if(b&1) ans=(ans*a)%mod;
50 b>>=1;
51 a=(a*a)%mod;
52 }
53 return ans%mod;
54 }
55 void factor(__int64 n)
56 {
57 int i;
58 for(i=0;i<m&&prime[i]*prime[i]<=n;i++)
59 while(n%prime[i]==0)
60 {
61 v.push_back(prime[i]);
62 n/=prime[i];
63 }
64 if(n>1) v.push_back(n);
65 }
66 void combine()
67 {
68 sort(v.begin(),v.end());
69 int i,j;
70 flen=0;
71 fac[flen][0]=v[0];
72 fac[flen++][1]=1;
73 for(i=1;i<v.size();i++)
74 {
75 if(v[i]==fac[flen-1][0])
76 fac[flen-1][1]++;
77 else
78 {
79 fac[flen][0]=v[i];
80 fac[flen++][1]=1;
81 }
82 }
83 }
84 __int64 inverse(__int64 a)
85 {
86 __int64 x,y;
87 extend_gcd(a,mod,x,y);
88 return (x%mod+mod)%mod;
89 }
90 __int64 euler(__int64 n)
91 {
92 int i;
93 __int64 ans=1;
94 for(i=0;i<flen&&fac[i][0]*fac[i][0]<=n;i++)
95 {
96 if(n%fac[i][0]==0)
97 {
98 ans*=fac[i][0]-1;
99 n/=fac[i][0];
100 while(n%fac[i][0]==0)
101 {
102 ans*=fac[i][0];
103 n/=fac[i][0];
104 }
105 }
106 }
107 if(n>1) ans*=n-1;
108 return ans%mod;
109 }
110 void dfs(__int64 d,__int64 num,__int64 cnt_B,__int64 k)
111 {
112 if(d>=flen)
113 {
114 ret_A=(ret_A+pows(cnt_B,k/num)*euler(num)%mod)%mod;
115 return ;
116 }
117 for(int i=0;i<=fac[d][1];i++)
118 {
119 dfs(d+1,num,cnt_B,k);
120 num*=fac[d][0];
121 }
122 }
123 __int64 get_A(__int64 k,__int64 cnt_B)
124 {
125 ret_A=0;
126 dfs(0,1,cnt_B,k);
127 return ((ret_A*inverse_k)%mod)*C%mod;
128 }
129 __int64 get_B(__int64 n)
130 {
131 __int64 ans=pows(C,n*n);
132 ans=(ans+pows(C,(n*n+1)/2)%mod)%mod;
133 ans=(ans+2*pows(C,(n*n+3)/4)%mod)%mod;
134 return (ans*inverse_4)%mod;
135 }
136 //枚举B
137 //d表示深度,num表示枚举因子的大小
138 void dfsB(__int64 d,__int64 num)
139 {
140 if(d>=flen)
141 {
142 __int64 cnt_B=get_B(num);
143 __int64 k=(A*A-1)/num/num;
144 inverse_k=inverse(k);
145 ans=(ans+get_A(k,cnt_B))%mod;
146 return ;
147 }
148 int temp=fac[d][1];
149 for(int i=0;i<=temp;i+=2,fac[d][1]-=2)
150 {
151 dfsB(d+1,num);
152 num*=fac[d][0];
153 }
154 fac[d][1]=temp;
155 }
156 __int64 solve()
157 {
158 v.clear();
159 factor(A-1);
160 factor(A+1);
161 combine();
162 ans=0;
163 dfsB(0,1);
164 return ans;
165 }
166 int main()
167 {
168 init();
169 int t,k=0;
170 inverse_4=inverse(4);
171 cin>>t;
172 while(t--)
173 {
174 scanf("%I64d%I64d",&A,&C);
175 if(A==1)
176 printf("Case %d: %I64d\n",++k,C);
177 else printf("Case %d: %I64d\n",++k,solve());
178 }
179 return 0;
180 }

 

 

 

hdu 3441 Rotation的更多相关文章

  1. HDU 4708:Rotation Lock Puzzle

    Rotation Lock Puzzle Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  2. HDU 4708 Rotation Lock Puzzle(模拟)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4708 题目大意:给定一个方形矩阵,边长为3-10的奇数.每一圈的数字可以沿着顺时针方向和逆时针方向旋转 ...

  3. HDU 4708 Rotation Lock Puzzle (简单题)

    Rotation Lock Puzzle Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  4. hdu 4708 Rotation Lock Puzzle 2013年ICPC热身赛A题 旋转矩阵

    题意:给出一个n*n的矩阵,旋转每一圈数字,求出对角线可能的最大值,以及转到最大时的最小距离. 只要分析每一层就可以了,本来想用地址传递二维数组,发现行不通,改了一下就行了. 这里有个坑,比如: 1 ...

  5. IDA*、操作打表、并行处理-The Rotation Game HDU - 1667

    万恶之源 优秀题解 用文字终究难以穷尽代码的思想 思路 每次操作都有八种选择,相当于一棵每次延申八个子节点的搜索树,故搜索应该是一种方法.而这题要求求最少步数,我们就可以想到可以试试迭代加深搜索(但其 ...

  6. HDU 1667 The Rotation Game (A*迭代搜索)

    题目大意:略 每次选择一个最大深度K,跑IDA* 估价函数H=8-中间8个格里出现次数最多的数的个数x,即把它填满这个数最少需要8-x次操作,如果dep+H>K,就跳出.. 深搜的时候暴力修改, ...

  7. hdu 1667 The Rotation Game ( IDA* )

    题目大意: 给你一个“井”子状的board,对称的由24个方块组成,每个方块上有123三个数字中的一个.给你初始状态,共有八种变换方式,求字典序最小的最短的的变换路径使得,board中间的八个方块上数 ...

  8. HDU 1817Necklace of Beads(置换+Polya计数)

    Necklace of Beads Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

  9. hduoj 4708 Rotation Lock Puzzle 2013 ACM/ICPC Asia Regional Online —— Warmup

    http://acm.hdu.edu.cn/showproblem.php?pid=4708 Rotation Lock Puzzle Time Limit: 2000/1000 MS (Java/O ...

随机推荐

  1. 获取iOS设备信息的编程接口

    参考资料: [1] 博客园,iOS屏幕尺寸和分辨率了解 [2] 张兴业,获取手机信息(UIDevice.NSBundle.NSLocale), CSDN

  2. 解决ubuntu 14.04 下eclipse 3.7.2 不能启动,报Could not detect registered XULRunner to use 或 org.eclipse.swt.SWTError: XPCOM 等问题的处理

    对于eclipse 3.7.2在ubuntu 14.04下不能启动,需要在 eclipse/configuration 目录下的config.ini文件内增加一行org.eclipse.swt.bro ...

  3. 主机win10与虚拟机ubuntu14.04通信

    主机是笔记本win10系统,在virtualbox虚拟机里面安装了ubuntu14.04系统,现在想让它们互联互通. 我的笔记本是通过路由器无线连接接入的互联网,设置了固定ip:192.168.0.4 ...

  4. DevExpress navBarControl 和 xtraTabbedMdiManager实现浏览器标签页效果

    一:navBarControl 属性设置 工具箱中的Navigation & Layout选项卡下找到NavBarControl,拖到窗体中 工具箱中添加2个imageCollection.分 ...

  5. [大牛翻译系列]Hadoop(3)MapReduce 连接:半连接(Semi-join)

    4.1.3 半连接(Semi-join) 假设一个场景,需要连接两个很大的数据集,例如,用户日志和OLTP的用户数据.任何一个数据集都不是足够小到可以缓存在map作业的内存中.这样看来,似乎就不能使用 ...

  6. 选项切换条--第三方开源--SHSegmentControl

    SHSegmentControl在github上的项目主页地址:https://github.com/7heaven/SHSegmentControl SHSegmentControl使用简单,在xm ...

  7. [转] shell字符串操作方法,以及实例

    每一种语言都有他独自的字符串操作方法,shell也一样,下面以以例子的方式,简单介绍常用方法. 1,取得字符串长度 string=abc12342341 //等号二边不要有空格 echo ${#str ...

  8. openerp 经典收藏 workflow中的‘非典型’自动触发器trigger_model(转载)

    workflow中的‘非典型’自动触发器trigger_model 原文:http://cn.openerp.cn/workflow%E4%B8%AD%E7%9A%84%E9%9D%9E%E5%85% ...

  9. Django Form的学习

    django.forms 是Django处理form的库      本质上可以直接通过对HttpRequest达到同样的效果,但是django.from带来更便捷的处理方式.功能有几点 通过form类 ...

  10. Oracle之存储过程

    1.存储过程创建 oracle中创建存储过程的语法如下: CREATE [OR REPLACE] PROCEDURE PRO_NAME[(parameter1[,parameter2]...)]is| ...