题意:给出A和C(1<=A,C<=10^9),所有满足B * B * K + 1 = A * A, (K >= 0)的B,构成边长为B的正方形,等角度的围绕在一个小正方形的周围。用C种颜色着色,边长为B的正方形旋转后相同视为相同的方案,整个图形绕中间的小正方形旋转后相同也视为相同的着色方案,求着色方案数。

整体思路是:

首先,忽略中间的小正方形,得到所有的B,求边长为B的着色的方案数X。

其次,将每个B看成一个点,求用X种颜色对一个环着色的方案数。

最后,将答案乘以C。

要得到所有的B。由于A*A达10^18次方,根号n的复杂度寻找B肯定行不通。观察到B*B*K=A*A-1=(A+1)*(A-1)。

因此,分别对A+1和A-1分解质因子。

通过DFS枚举质因子得到B的值,同时剩下的质因子是K的。

再通过一个DFS对剩下的质因子枚举出K的约数即可。

对正方形着色:【HDU】1812 Count the Tetris

对环着色:【POJ】2154 Color

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<algorithm>
  4 #define MAXN 32000
  5 #define P 1000000007
  6 typedef long long LL;
  7 using namespace std;
  8 bool p[MAXN], flag1, flag2;
  9 LL A, B, C, K;
 10 LL ans1, ans2;
 11 int depth1, depth2;
 12 int prime[MAXN], factor[MAXN];
 13 int prime_size, factor_size, prifac_size;
 14 struct node {
 15     int val, cnt;
 16 } prifac[MAXN];
 17 void Init() {
 18     int i, j;
 19     memset(p, true, sizeof(p));
 20     for (i = 2; i < 180; i++) {
 21         if (p[i]) {
 22             for (j = i * i; j < MAXN; j += i)
 23                 p[j] = false;
 24         }
 25     }
 26     prime_size = 0;
 27     for (i = 2; i < MAXN; i++) {
 28         if (p[i])
 29             prime[prime_size++] = i;
 30     }
 31 }
 32 void Factor(int x) {
 33     int i;
 34     for (i = 0; prime[i] * prime[i] <= x; i++) {
 35         while (x % prime[i] == 0) {
 36             factor[factor_size++] = prime[i];
 37             x /= prime[i];
 38         }
 39     }
 40     if (x > 1)
 41         factor[factor_size++] = x;
 42 }
 43 LL Pow(LL a, LL b) {
 44     LL ans;
 45     for (ans = 1; b; b >>= 1) {
 46         if (b & 1)
 47             ans *= a;
 48         a *= a;
 49     }
 50     return ans;
 51 }
 52 LL PowMod(LL a, LL b, LL c) {
 53     LL ans;
 54     a %= c;
 55     for (ans = 1; b; b >>= 1) {
 56         if (b & 1) {
 57             ans *= a;
 58             ans %= c;
 59         }
 60         a *= a;
 61         a %= c;
 62     }
 63     return ans;
 64 }
 65 LL ExtGcd(LL a, LL b, LL &x, LL &y) {
 66     LL t, d;
 67     if (b == 0) {
 68         x = 1;
 69         y = 0;
 70         return a;
 71     }
 72     d = ExtGcd(b, a % b, x, y);
 73     t = x;
 74     x = y;
 75     y = t - a / b * y;
 76     return d;
 77 }
 78 LL InvMod(LL a, LL n) {
 79     LL x, y;
 80     ExtGcd(a, n, x, y);
 81     return (x % n + n) % n;
 82 }
 83 LL Count1(LL n) {
 84     LL ans;
 85     if (n & 1)
 86         ans = (n - 1) * (n / 2 + 1) / 2 + 1;
 87     else
 88         ans = (n / 2) * (n / 2);
 89     return ans;
 90 }
 91 LL Count2(LL n) {
 92     LL ans;
 93     if (n & 1)
 94         ans = (n + 1) * (n - 1) / 2 + 1;
 95     else
 96         ans = n * n / 2;
 97     return ans;
 98 }
 99 LL Square(LL x, LL k) {
100     LL ans;
101     ans = PowMod(k, x * x, P);
102     ans += PowMod(k, Count1(x), P) * 2 % P;
103     if (ans >= P)
104         ans -= P;
105     ans += PowMod(k, Count2(x), P);
106     if (ans >= P)
107         ans -= P;
108     return ans * InvMod(4, P) % P;
109 }
110 LL Phi(LL x) {
111     int i;
112     LL res;
113     res = x;
114     for (i = 0; i < prifac_size; i++) {
115         if (prifac[i].cnt && x % prifac[i].val == 0)
116             res -= res / prifac[i].val;
117     }
118     return res % P;
119 }
120 void Find(int now, int index, LL res, LL color) {
121     if (now == depth2) {
122         flag2 = true;
123         ans2 += PowMod(color, res, P) * Phi(K / res) % P;
124         if (ans2 >= P)
125             ans2 -= P;
126     } else {
127         int i, j;
128         for (i = index; i < prifac_size; i++) {
129             for (j = 1; j <= prifac[i].cnt; j++)
130                 Find(now + 1, i + 1,
131                         res * Pow(prifac[i].val, j),
132                         color);
133         }
134     }
135 }
136 LL Burnside(LL n, LL k) {
137     ans2 = 0;
138     for (depth2 = 0;; depth2++) {
139         flag2 = false;
140         Find(0, 0, 1, k);
141         if (!flag2)
142             break;
143     }
144     return ans2 * InvMod(n, P) % P;
145 }
146 void DFS(int now, int index, LL res) {
147     if (now == depth1) {
148         flag1 = true;
149         B = res;
150         K = (A - 1) * (A + 1) / (B * B);
151         ans1 += Burnside(K, Square(B, C));
152         if (ans1 >= P)
153             ans1 -= P;
154     } else {
155         LL tmp;
156         int i, j;
157         for (i = index; i < prifac_size; i++) {
158             for (j = 2; j <= prifac[i].cnt; j += 2) {
159                 prifac[i].cnt -= j;
160                 tmp = res * Pow(prifac[i].val, j >> 1);
161                 DFS(now + 1, i + 1, tmp);
162                 prifac[i].cnt += j;
163             }
164         }
165     }
166 }
167 LL Cal() {
168     int i, j;
169     factor_size = prifac_size = 0;
170     Factor(A - 1);
171     Factor(A + 1);
172     sort(factor, factor + factor_size);
173     for (i = 0; i < factor_size; i = j) {
174         prifac[prifac_size].val = factor[i];
175         prifac[prifac_size].cnt = 0;
176         for (j = i; j < factor_size && factor[i] == factor[j]; j++)
177             prifac[prifac_size].cnt++;
178         prifac_size++;
179     }
180     ans1 = 0;
181     for (depth1 = 0;; depth1++) {
182         flag1 = false;
183         DFS(0, 0, 1);
184         if (!flag1)
185             break;
186     }
187     return ans1 * C % P;
188 }
189 int main() {
190     int c, ca = 1;
191     LL ans;
192     Init();
193     scanf("%d", &c);
194     while (c--) {
195         scanf("%lld%lld", &A, &C);
196         if (A == 1)
197             ans = C;
198         else
199             ans = Cal();
200         printf("Case %d: %lld\n", ca++, ans);
201     }
202     return 0;
203 }

转载于:https://www.cnblogs.com/DrunBee/archive/2012/09/15/2686931.html

【HDU】3441 Rotation相关推荐

  1. 【HDU】1695 GCD

    题意:x在[a,b]内,y在[c,d]内,求GCD(x,y)=k的个数,题目保证a=c=1. 由于GCD(x,y)=k,则GCD(x/k,y/k)=1. 那么只要求x在[1,b/k]内,y在[1,d/ ...

  2. 【HDU】4942 Game on S♂play 线段树

    传送门:[HDU]4942 Game on S♂play 题目分析:今天下午被这道题整死了,因为我的写法导致有的数可能变成负的,但是我们有察觉到,debug了一下午还是在吃饭的时候突然想到这个问题的. ...

  3. 【HDU】5238 Calculator 【中国剩余定理+线段树】

    传送门:[HDU]5238 Calculator 题目分析: 模数可以拆成四个小素数:7,13,17,19. 这样我们可以分别对这几个素数跑答案,最后中国剩余定理搞一下就好.中间我们用线段树,保存每个 ...

  4. 【HDU】5197 DZY Loves Orzing 【FFT启发式合并】

    传送门:[HDU]5197 DZY Loves Orzing 题目分析: 首先申明,我不会dpdp方程= =--这个东西给队友找出来了,然后我就是套这个方程做题的Qrz-- 对于这题,因为n2n^2个 ...

  5. 【HDU】1535 Invitation Cards 最短路

    传送门:[HDU]1535 Invitation Cards 题目分析:题目真难读......其实题目的意思就是让求从编号为1的点到其他所有点的最短路距离之和加上其他所有点到编号为1的点的最短路距离之 ...

  6. 【HDU】4411 Arrest 费用流

    传送门:[HDU]4411 Arrest 题目分析:题目的意思一开始没看懂= =...题意大致为:派出至多K个警队遵守先灭小的再灭老的的原则将N个城市的帮派全端了(要灭编号大的必须要先灭编号小的).且 ...

  7. 【HDU】3271 SNIBB 数位DP

    传送门:[HDU]3271 SNIBB 题目分析:第一问直接求,第二问就二分.水题. 代码如下: #include <cmath> #include <cstdio> #inc ...

  8. 【HDU】5370 Tree Maker 【树dp】

    传送门:[HDU]5370 Tree Maker my  code:my~~code: #include <bits/stdc++.h> using namespace std ;type ...

  9. 【HDU】4859 海岸线 黑白染色+最小割

    传送门:[HDU]4859 题目分析: 最小割的思想真是博大精深! 本题的模型是最小割. 我们需要最大化海岸线的长度,如果相邻两点属性不同才会存在海岸线(海和陆地),所以我们可以将题目转化成最小化不是 ...

最新文章

  1. Pytorch Bi-LSTM + CRF 代码详解
  2. python os.system执行shell 命令
  3. button属性,居然才发现
  4. 测试发送消息和接受消息
  5. Appointment get entity debug
  6. Quartz简单实例
  7. (计算机组成原理)408之外内容补充(非统考考生需要了解|以白中英教材为准)
  8. 安装linux环境及相关包方法
  9. 采用Locust对grpc协议进行压测
  10. 2021扬州市高考成绩查询,2021高考成绩查询系统登录官网入口
  11. 如何在旅途中提升 MacBook 电池电量?
  12. 【读书笔记】《华为工作法》
  13. 删除可恶的7654.com,7654导航篡改首页恢复,如何解决浏览器被7654劫持
  14. Web前端开发:HTML、CSS
  15. 【Gamma】Scrum Meeting 1 与助教谈话
  16. 报名系统网页导出html,教资报名系统提示网站兼容性怎么办 ie浏览器兼容性操作流程...
  17. python的yield是什么意思,python生成器是怎么使用的 python中yield是什么意思
  18. alias,unalias命令
  19. 【生物信息学】:基于Linux下的pgap安装及通用教程(持续更新中)
  20. 《Python中神奇的第三方库:Faker》

热门文章

  1. 字节跳动最新开源!java语言程序设计进阶篇
  2. 【PAT (Advanced Level) Practice】1124 Raffle for Weibo Followers (20 分)
  3. python【蓝桥杯vip练习题库】ADV-281特等奖学金
  4. python【力扣LeetCode算法题库】257- 二叉树的所有路径
  5. oracle SQL 命令行(一.基础)
  6. linux 脚本select菜单,Shell:如何写一个多选菜单的脚本
  7. mfc e将控件置于窗口顶层_【创e分享】Word毕业论文排版全攻略
  8. genrsa out php,PHP进行RSA加密解密
  9. C语言估算数学常量e,c语言常量的正确表示方法有哪些
  10. 网络营销外包浅析B站破圈运营是如何增强网络营销能力的?