好题!!!没话说……

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

原始推导过程见: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. Android studio 读取properties文件

    System.out.println(Thread.currentThread().getContextClassLoader().getResource("").getPath( ...

  2. SQL联合查询中的关键语法(转)

    联合查询效率较高.以下例子来说明联合查询的好处 t1表结构(用户名,密码)    userid int         username   varchar(20)     password      ...

  3. ASP.NET中的常用快捷键

    想查找ASP.NET中的属性快捷键,忘记了,搜了一下,找到了ASP.NET中的常用快捷键. 大神文章:http://www.cnblogs.com/xiacao/archive/2012/06/12/ ...

  4. WPF之UseLayoutRounding和SnapsToDevicePixels

    最近在工作中看别的朋友XML代码时,发现SnapsToDevicePixels 属性然后通过查询资料了解其作用 1)UserLayoutRounding为False,导致控件布局相对屏幕若不是整数则不 ...

  5. 【js】 流式布局 页面

    <!DOCTYPE html><html><head> <meta content="text/html; charset=utf-8" ...

  6. 微软职位内部推荐-Senior Software Development En

    微软近期Open的职位: Job Title: Senior Development Engineer Division: Visual Studio China - Developer Divisi ...

  7. 怎么删除有外键约束的MySQL表中的数据

    SET FOREIGN_KEY_CHECKS = 0 操作结束后 SET FOREIGN_KEY_CHECKS = 1

  8. Android Studio 单刷《第一行代码》系列 01 —— 第一战 HelloWorld

    前言(Prologue) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Android ...

  9. 用protobuf编译时报错:protoc: error while loading shared libraries: libprotoc.so.9: cannot open shared object file: No such file or directory 的解决方法

    解决办法:export LD_LIBRARY_PATH=/usr/local/lib

  10. Ext学习-布局介绍

    1.目标    了解ExtJS中的关于布局和组建的相关原理,并学习相关的布局方式 2.内容   1.布局和组件的相关原理   2.常见的布局方式 3.学习流程    1.首先应该学习一下布局和组件的相 ...