Birthday Toy

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 644    Accepted Submission(s): 326

Problem Description
AekdyCoin loves toys. It is AekdyCoin’s Birthday today and he gets a special “Toy”.
The “Toy” is in bulk and AekdyCoin has to make one by him. Let’s assume that the “Toy” has N small white beads and one Big bead .If someone want to make a “Toy”, he (or she) must always puts the Big bead in center, and then connect the other N small beads around it by using N sticks with equal length, and then the N small beads must be connected by N sticks with equal length, and it could be seen as a regular polygon. Figure 1 shows a “Toy” with 8 small white beads and one big white bead.

Now AekdyCoin has C kinds of available color, say blue, green, yellow, pink …etc. He wants to color these beads, but he thinks that must be too boring and stupid. So he colors these beads with one role: any adjacent beads couldn’t have same color. Figure 2 shows a legal situation, and Figure 3 shows an illegal situation.


It seems that the “Toy” becomes more interesting for AekdyCoin right now; however, he wants to color the big bead in center. Of course, he should follow the role above.

Now AekdyCoin begins to play with the “Toy”, he always colors the big beads and then the other small beads. He should color under the rule above. After several minutes, AekdyCoin finally makes a perfect “Toy”. Figure 4 shows a situation that is under the color rule.

AekdyCoin now want to know the different method to color the “Toy” whit at most K color. (“Toy” contains N small beads and one big bead.)
But, no, the problem is not so easy .The repetitions that are produced by rotation around the center of the circular necklace are all neglected. Figure 5 shows 8 “Toy”, they are regard as one method.


Now AekdyCoin will give you N and K, he wants you to help him calculate the number of different methods, because the number of method is so huge, so AekdyCoin just want you to tell him the remainder when divided by M.
In this problem, M = 1,000,000,007.

 
Input
The input consists of several test cases.(at least 1000)
Every case has only two integers indicating N, K 
(3<=N<=10^9, 4<=K<=10^9)
 
Output
For each case, you should output a single line indicates the remainder of number of different methods after divided by M.
 
Sample Input
3 4
3 5
3 17
162 78923
 
Sample Output
8
40
19040
19469065
 
/*
hdu 2865 Polya计数+(矩阵 or 找规律 求C) 给你n个小球全部连在一个大球上然后对他们进行染色,要求相连的球颜色不一样
首先确定大球为一种颜色(k种可能)。然后用剩下k-1种用Polya去处理小球即可 在计算循环节长度为i的可能数时由于k很大,矩阵快速幂很明显不行诶
1.可以考虑递推,假设第一个颜色是x,用f[i][1]表示当前颜色是x,f[i][0]表示当前颜色非x。
f[i][1] = f[i-1][0]
f[i][0] = (k-2)*f[i-1][0]+(k-1)*f[i-1][1] 2.假设用3种颜色染循环节长度为len小球,构建出来的矩阵是
0 1 1 2 1 1 2 3 3 6 5 5 10 11 11
1 0 1 -> 1 2 1 -> 3 2 3 -> 5 6 5 -> 11 10 11
1 1 0 1 1 2 3 3 2 5 5 6 11 11 10
——参考自cxlove大神.
可以发现是有规律的:(2 = 3-1)
n = 1 -> 0 (2^n - 2)
n = 2 -> 6 (2^n + 2)
n = 3 -> 6 (2^n - 2)
n = 4 -> 18 (2^n + 2)
n = 5 -> 30 (2^n - 2)
代码为注释部分 hhh-2016-04-22 10:12:35
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <functional>
using namespace std;
#define lson (i<<1)
#define rson ((i<<1)|1)
typedef long long ll;
using namespace std;
const ll mod = 1e9 + 7;
const int maxn = 40010; int num;
int prime[maxn];
int isPrime[maxn]; void get_prime()
{
num = 0;
memset(isPrime,0,sizeof(isPrime));
for(int i = 2; i <= maxn-10; i++)
{
if(!isPrime[i])
{
prime[num++] = i;
for(int j = i+i; j <= maxn-10; j+=i)
isPrime[j] = 1;
}
}
} ll euler(ll cur)
{
ll ans = cur;
ll x = cur;
for(int i = 0; i < num && prime[i]*prime[i] <= cur; i++)
{
if(x % prime[i] == 0)
{
ans = ans/prime[i]*(prime[i]-1);
while(x % prime[i] == 0)
x /= prime[i];
}
}
if(x > 1)
{
ans = ans/x*(x-1);
}
return ans%mod;
} ll pow_mod(ll a,ll n)
{
ll ret = 1;
a %= mod;
while(n)
{
if(n & 1) ret = ret*a%mod;
a = a*a%mod;
n >>= 1;
}
return ret%mod;
} /*
another:
ll solve(ll p,ll k)
{
ll ans=pow_mod(p-1,k);
if(k&1)
ans=(ans+mod-(p-1))%mod;
else
ans=(ans+p-1)%mod;
return ans;
}
*/ struct Matrix
{
ll ma[3][3];
Matrix()
{
memset(ma,0,sizeof(ma));
}
}; Matrix mult(Matrix ta,Matrix tb)
{
Matrix tc;
for(int i = 0 ; i < 2; i ++)
{
for(int j = 0; j < 2; j++)
{
for(int k = 0; k < 2; k++)
tc.ma[i][j] = (tc.ma[i][j] + ta.ma[i][k]*tb.ma[k][j]%mod)%mod;
}
}
return tc;
} Matrix Mat_mod(Matrix a,int n)
{
Matrix cnt;
for(int i = 0; i < 2; i++)
cnt.ma[i][i] = 1;
while(n)
{
if(n & 1 ) cnt = mult(cnt,a);
a = mult(a,a);
n >>= 1;
}
return cnt;
} Matrix mat;
Matrix begi; ll solve(ll p,ll k)
{
begi.ma[0][1] = 1,begi.ma[0][0] = 0,begi.ma[1][0] = 0,begi.ma[1][1] = 0;
mat.ma[0][0] = p - 2, mat.ma[1][0] = p - 1, mat.ma[0][1] = 1, mat.ma[1][1] = 0;
mat = Mat_mod(mat,k-1);
Matrix tp = mult(begi,mat);
return p*tp.ma[0][0]%mod;
} ll cal(ll n,ll k)
{
ll ans = 0;
for(int i = 1; i*i <= n; i++)
{
if(n % i == 0)
{
ans = (ans + solve(k,n/i)*euler(i)%mod)%mod;
if(n != i*i)
ans = (ans + solve(k,i)*euler(n/i)%mod)%mod;
}
}
return (ans*pow_mod(n,mod-2))%mod;
} ll N,k; int main()
{
get_prime();
while(scanf("%I64d%I64d",&N,&k) != EOF)
{
printf("%I64d\n",k*cal(N,k-1)%mod);
}
return 0;
}

  

hdu 2865 Polya计数+(矩阵 or 找规律 求C)的更多相关文章

  1. hdu 5868 Polya计数

    Different Circle Permutation Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 262144/262144 K ...

  2. 【poj 3090】Visible Lattice Points(数论--欧拉函数 找规律求前缀和)

    题意:问从(0,0)到(x,y)(0≤x, y≤N)的线段没有与其他整数点相交的点数. 解法:只有 gcd(x,y)=1 时才满足条件,问 N 以前所有的合法点的和,就发现和上一题-- [poj 24 ...

  3. 2018年东北农业大学春季校赛 B wyh的矩阵【找规律】

    链接:https://www.nowcoder.com/acm/contest/93/B来源:牛客网 题目描述 给你一个n*n矩阵,按照顺序填入1到n*n的数,例如n=5,该矩阵如下 1 2 3 4 ...

  4. HDU 4388 Stone Game II 博弈论 找规律

    http://acm.hdu.edu.cn/showproblem.php?pid=4388 http://blog.csdn.net/y1196645376/article/details/5214 ...

  5. HDU 4349 Xiao Ming's Hope 找规律

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4349 Xiao Ming's Hope Time Limit: 2000/1000 MS (Java/ ...

  6. HDU 4731 Minimum palindrome 打表找规律

    http://acm.hdu.edu.cn/showproblem.php?pid=4731 就做了两道...也就这题还能发博客了...虽然也是水题 先暴力DFS打表找规律...发现4个一组循环节.. ...

  7. HDU 4588 Count The Carries(找规律,模拟)

    题目 大意: 求二进制的a加到b的进位数. 思路: 列出前几个2进制,找规律模拟. #include <stdio.h> #include <iostream> #includ ...

  8. HDU 3032 (SG打表找规律)

    题意: 有n堆石子,alice先取,每次可以选择拿走一堆石子中的1~x(该堆石子总数) ,也可以选择将这堆石子分成任意的两堆.alice与bob轮流取,取走最后一个石子的人胜利. 思路: 因为数的范围 ...

  9. 2017ACM暑期多校联合训练 - Team 1 1011 HDU 6043 KazaQ's Socks (找规律)

    题目链接 Problem Description KazaQ wears socks everyday. At the beginning, he has n pairs of socks numbe ...

随机推荐

  1. C语言--第三周作业

    一.PTA作业中4个题目 1.7-9 A乘以B 要求:输入的两个整数:A是你学号前两位数字,B是你学号后两位数字 a.代码 #include <stdio.h> int main () { ...

  2. 团队作业4——第一次项目冲刺(Alpha版本)11.18

    a. 提供当天站立式会议照片一张 举行站立式会议,讨论项目安排: 整理各自的任务汇报: 全分享遇到的困难一起讨论: 讨论接下来的计划: b. 每个人的工作 (有work item 的ID) 1.前两天 ...

  3. 关于安装wordpress出现500 Internal Server Error的解决方案

    安装新版本wordpress出现500 Internal Server Error的问题: 在./wp-includes/class-http.php的268行,改成 $request_order = ...

  4. C简单实现动态顺序表

    <span style="font-size:18px;">一下为简单实现:</span> #define SIZE 3; typedef int Data ...

  5. bzoj 4373 算术天才⑨与等差数列

    4373: 算术天才⑨与等差数列 Time Limit: 10 Sec  Memory Limit: 128 MBhttp://www.lydsy.com/JudgeOnline/problem.ph ...

  6. 【TensorFlow随笔】关于一个矩阵与多个矩阵相乘的问题

    问题描述: Specifically, I want to do matmul(A,B) where  'A' has shape (m,n)  'B' has shape (k,n,p) and t ...

  7. JAVA_SE基础——42.final修饰符

    高手勿喷~ final关键字可用于修饰类.变量和方法,它有"这是无法改变的"或者"最终"的含义,因此被final修饰的类.变量和方法将具有以下特征: 1.fin ...

  8. JAVA_SE基础——41.instanceof关键字(运算符)

    instanceof 关键字 instanceof关键字的作用:判断一个对象是否属于指定的类别. instanceof关键字的使用前提:判断的对象与指定的类别必须要存在继承或者实现的关系.关于实现以后 ...

  9. Django rest framework源码分析(4)----版本

    版本 新建一个工程Myproject和一个app名为api (1)api/models.py from django.db import models class UserInfo(models.Mo ...

  10. Web系统Login拦截器

    所需要导入的包类:import org.springframework.web.servlet.HandleInterceptor;(拦截器要继承该类) public class loginInter ...