好题!!!没话说……

用到的知识面很多,这题的难点在于公式的推导。

原始推导过程见: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的更多相关文章

  1. HDU 2865 Birthday Toy [Polya 矩阵乘法]

    传送门 题意: 相邻珠子不能相同,旋转等价.$n$个珠子$k$中颜色,求方案数 首先中间珠子$k$种选择,$k--$如果没有相邻不同的限制,就和$POJ\ 2154$一样了$|C(f)|=k^{\#( ...

  2. HDU 2865 Birthday Toy

    题目链接 题意:n个小珠子组成的正n边形,中间有一个大珠子.有木棍相连的两个珠子不能有相同的颜色,旋转后相同视为相同的方案,求着色方案数. \(\\\) 先选定一种颜色放在中间,剩下的\(k-1\)种 ...

  3. HDU 1007 Quoit Design(二分+浮点数精度控制)

    Quoit Design Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  4. hdu 2865 Polya计数+(矩阵 or 找规律 求C)

    Birthday Toy Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  5. hdu 4052 线段树扫描线、奇特处理

    Adding New Machine Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  6. hdu 1828 线段树扫描线(周长)

    Picture Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  7. hdu 4453 splay

    Looploop Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  8. 随手练——HDU 1078 FatMouse and Cheese(记忆化搜索)

    http://acm.hdu.edu.cn/showproblem.php?pid=1078 题意: 一张n*n的格子表格,每个格子里有个数,每次能够水平或竖直走k个格子,允许上下左右走,每次走的格子 ...

  9. HDU 1007 Quoit Design(经典最近点对问题)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1007 Quoit Design Time Limit: 10000/5000 MS (Java/Oth ...

随机推荐

  1. UINavigationController的popViewControllerAnimated问题

    UINavigationController是IOS编程中的一个view controller的容器,通过栈管理viewControllers,每一次push操作都将在栈顶添加一个view contr ...

  2. 《postfix邮件服务下mailq、postmap、postqueue 、 postsuper等用法》

    1.Mailq 功能说明:显示待寄邮件的清单. 语 法:mailq [-q] 补充说明:mailq可列出待寄邮件的清单,包括邮件ID,邮件大小,邮件保存时间,寄信人,收信人,以及邮件无法寄出的原因,提 ...

  3. mongodb 入门笔记

    选择Mongo的关键是:这是一个 JSON 文档数据库. 1. Mongo 的术语 文档:一条完整的数据就是一个文档(对应于 MySQL 的一行). 集合:一组文档构成一个集合.类似 MySQL 中表 ...

  4. PHP获取当前日期或指定日期的所在月的第一天和最后一天

    <?php function getthemonth($date) { $firstday = date('Y-m-01', strtotime($date)); $lastday = date ...

  5. 为ProgressBar进度条设置颜色1

    可以通过xml文件来设置,方法如下: 1:先在布局文件中的ProgressBar加入下面属性: android:progressDrawable="@drawable/progress_ba ...

  6. mikrotik/IPSec Dynamic End points Updater.rsc

    # IPSec Peer/Policy Updater for Dynamic WAN addresses # ============================================ ...

  7. Oracle 表的访问方式(1) ---全表扫描、通过ROWID访问表

    1.Oracle访问表的方式 全表扫描.通过ROWID访问表.索引扫描 2.全表扫描(Full Table Scans, FTS) 为实现全表扫描,Oracle顺序地访问表中每条记录,并检查每一条记录 ...

  8. 使用IE浏览器下载时候窗口一闪而过

    使用IE浏览器下载东西时,窗口一闪而过,那么这个问题怎么处理呢? 解决办法: 1.按住ctrl键进行下载 2.浏览器>工具>internet选项>安全自定义级别>下载文件自动提 ...

  9. 短小强悍的JavaScript异步调用库

    对于博文 20行完成一个JavaScript模板引擎 的备受好评我感到很惊讶,并决定用此文章介绍使用我经常使用的另一个小巧实用的工具.我们知道,在浏览器中的 JavaScript 绝大部分的操作都是异 ...

  10. c#之委托和事件的区别

    1.什么是委托,这里就不做介绍了,如果想了解可以查看博客:http://www.cnblogs.com/xiaoxiaogogo/p/3571494.html 下面开始对事件进行介绍 1.定义事件以及 ...