hdu 2481 Toy
好题!!!没话说……
用到的知识面很多,这题的难点在于公式的推导。
原始推导过程见:http://hi.baidu.com/spellbreaker/item/d8bb3bda5af30be6795daa93
这个过程有点小问题,改进后的见:http://blog.csdn.net/acm_cxlove/article/details/7868589
下面是自己敲的代码:
/*************************************************************************
> File Name: xh.cpp
> Author: XINHUA
> Mail: 525799145@qq.com
> Created Time: 2013/7/19 星期五 15:11:25 新华
************************************************************************/ #include<iostream>
#include<stdio.h>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<string>
#include<vector>
using namespace std;
int prime[],m,n;
bool f[]={};
__int64 mod;
struct ma
{
__int64 a[][];
void init()
{
a[][]=a[][]=;
a[][]=a[][]=;
}
}e;
//使用二分模拟乘法计算(a和b的范围太大)
__int64 mulmod(__int64 a,__int64 b)
{
a%=mod;b%=mod;
if(a<) a+=mod;
if(b<) b+=mod;
__int64 ans=;
while(b)
{
if(b&)
{
ans+=a;
if(ans>=mod) ans-=mod;
}
a=a<<;
if(a>=mod) a-=mod;
b=b>>;
}
return ans%mod;
}
ma operator*(ma ab,ma b)
{
ma ans;
int i,j,k;
for(i=;i<;i++)
{
for(j=;j<;j++)
{
ans.a[i][j]=;
for(k=;k<;k++)
ans.a[i][j]=(ans.a[i][j]+mulmod(ab.a[i][k],b.a[k][j]))%mod;
}
}
return ans;
}
ma operator^(ma ab,int b)
{
ma ans;
ans.init();
while(b)
{
if(b&) ans=ans*ab;
b>>=;
ab=ab*ab;
}
return ans;
} void init_prime()
{
int i,j;
m=;
for(i=;i<=;i++)
{
if(f[i]==) prime[m++]=i;
for(j=;j<m&&i*prime[j]<=;j++)
{
f[i*prime[j]]=;
if(i%prime[j]==) break;
}
}
}
__int64 euler(__int64 n)
{
__int64 ans=;
for(int i=;i<m&&prime[i]*prime[i]<=n;i++)
{
if(n%prime[i]==)
{
ans*=prime[i]-;
n/=prime[i];
while(n%prime[i]==)
{
n/=prime[i];
ans=(ans*prime[i])%mod;
}
}
}
if(n>) ans*=n-;
return ans%mod;
}
__int64 get_T(int k)
{
if(k==) return ;
else if(k==) return ;
ma temp=e^(k-);
__int64 f=*temp.a[][]+temp.a[][];
__int64 g=*(f-(*temp.a[][]+temp.a[][])-);
return (f+g)%mod;
}
int main()
{
init_prime();
e.a[][]=;e.a[][]=;e.a[][]=-;e.a[][]=;
while(scanf("%d%I64d",&n,&mod)!=EOF)
{
mod=(__int64)n*mod;
__int64 sum=;
for(int i=;i*i<=n;i++)
{
if(n%i==)
{
sum=(sum+mulmod(euler(i),get_T(n/i)))%mod;
if(i*i!=n)
sum=(sum+mulmod(euler(n/i),get_T(i)))%mod;
}
}
sum/=n;
printf("%I64d\n",sum%(mod/n));
}
return ;
}
hdu 2481 Toy的更多相关文章
- HDU 2865 Birthday Toy [Polya 矩阵乘法]
传送门 题意: 相邻珠子不能相同,旋转等价.$n$个珠子$k$中颜色,求方案数 首先中间珠子$k$种选择,$k--$如果没有相邻不同的限制,就和$POJ\ 2154$一样了$|C(f)|=k^{\#( ...
- HDU 2865 Birthday Toy
题目链接 题意:n个小珠子组成的正n边形,中间有一个大珠子.有木棍相连的两个珠子不能有相同的颜色,旋转后相同视为相同的方案,求着色方案数. \(\\\) 先选定一种颜色放在中间,剩下的\(k-1\)种 ...
- HDU 1007 Quoit Design(二分+浮点数精度控制)
Quoit Design Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- hdu 2865 Polya计数+(矩阵 or 找规律 求C)
Birthday Toy Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- hdu 4052 线段树扫描线、奇特处理
Adding New Machine Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- hdu 1828 线段树扫描线(周长)
Picture Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- hdu 4453 splay
Looploop Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- 随手练——HDU 1078 FatMouse and Cheese(记忆化搜索)
http://acm.hdu.edu.cn/showproblem.php?pid=1078 题意: 一张n*n的格子表格,每个格子里有个数,每次能够水平或竖直走k个格子,允许上下左右走,每次走的格子 ...
- HDU 1007 Quoit Design(经典最近点对问题)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1007 Quoit Design Time Limit: 10000/5000 MS (Java/Oth ...
随机推荐
- atoi 实现
int atoi(const char *nptr); 把字符串转换成整型数.ASCII to integer 的缩写. 头文件: #include <stdlib.h> 参数nptr字符 ...
- Debug Intro
The ABAP Debugger is used tool to execute and analyze programs line by line. Using it we can check t ...
- windows phone 8 开发系列(二)Hello Wp8!
上篇我们了解了WP8的环境搭建,从今天开始,我们就正式进入WP8的设计,开发阶段. 一. 项目模板介绍 打开vs,选择Windows Phone的项目模板,我们发现如下有很多模板,那么我们就从认识这些 ...
- 如何开启MYSQL远程连接权限
开启MYSQL远程连接权限 //建议设置固定IP mysql> GRANT ALL PRIVILEGES ON *.* TO root@"8.8.8.8" IDENTIFIE ...
- trade 1.0 开源工具
dapper.net T4PocoGenerator/ Dapper.ColumnMapper 参考链接: http://blog.csdn.net/ymnets/article/details/85 ...
- 如果在配置中将“system.serviceModel/serviceHostingEnvironment/multipleSiteBindingsEnabled”设置为 true,则需要终结点指定相对地址。如果在终结点上指定相对侦听 URI,则该地址可以是绝对地址。若要解决此问题,请为终结点“http://localhost/Service1.svc”指定相对 URI。
问题: 如果在配置中将"system.serviceModel/serviceHostingEnvironment/multipleSiteBindingsEnabled"设置为 ...
- WPF学习02:Routed Events
与传统的桌面开发相比,在事件模型上WPF引入了Routed Events,从开发者的角度上,我们获得了两个便利: 1.可以实现事件路由,即向XAML结构中的父元素路由或者是向子元素路由. 2. Rou ...
- c语言之fopen参数(r+,w+,a+)
经查找一些资料,并且亲自实验之后得出: r+:打开已存在的文件时,光标位于开头,文件可读,可写, 写数据时,由于光标位于开头,所以会覆盖原有数据 w+:打开的文件已存在时,将覆盖原文件 a+:打开已存 ...
- linux c 分解质因数
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> ...
- Java集合的小抄
在尽可能短的篇幅里,将所有集合与并发集合的特征.实现方式.性能捋一遍.适合所有"精通Java",其实还不那么自信的人阅读. [转自:花钱的年华] 期望能不止用于面试时,平时选择数据 ...