HDU 4767——Bell
昨天比赛被虐的这个题目。
今天听斌牛讲过他的思路后就A掉了。
题目的意思是要你求出bell数的第n项对95041567取模。
首先,95041567=31*37*41*43*47;
然后取模就是先分别取模,然后就用中国剩余定理合并了。
现在的问题就是如何求出来B[n]对95041567分别取模的结果了哦。
不错,现在你缺少的就是一个公式——B[P^m+n]==(B[n]+B[n+1])%P——P为任一个质数(来自维基百科)。
这样的话我们就可以递推了哦。
从大的开始往小的递推,每次减去一个最大的P^m,知道推到一个n<=P,用记忆化<map>就A掉了。
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
#define N 95041567
#define maxn 2147483647
#define ll long long
using namespace std; llm[5]={31,37,41,43,47},a[5],n,t;
llf[5][50][50];
map<ll,ll>ss; void function()
{
for (lli=0; i<5; i++)
{
f[i][0][0]=1;
f[i][1][1]=1;
for (llj=2; j<=m[i]; j++)
{
f[i][j][1]=f[i][j-1][j-1];
for (llk=2; k<=j; k++)
f[i][j][k]=(f[i][j][k-1]+f[i][j-1][k-1])%m[i];
}
}
} llget(lltot,llx)
{
if (tot<=m[x]) return f[x][tot][tot];
if (ss[tot]!=0) return ss[tot];
llM=1,cur=m[x];
while (cur*m[x]<=tot) M++,cur*=m[x];
ss[tot]=(M*get(tot-cur,x)+get(tot-cur+1,x))%m[x];
return ss[tot];
} void exgcd(llA,llB,ll& x,ll& y)
{
if (!B) { x=1,y=0; }
else { exgcd(B,A%B,y,x); y-=A/B*x; }
} llchina()
{
lld,x=0,y;
for (lli=0; i<5; i++)
{
llw=N/m[i];
exgcd(m[i],w,d,y);
x=(x+y*w*a[i])%N;
}
return (x+N)%N;
} int main()
{
function();
cin>>t;
while (t--)
{
cin>>n;
for (lli=0; i<5; i++)
{
ss.clear();
a[i]=get(n,i);
}
cout<<china()<<"\n";
}
return 0;
}
HDU 4767——Bell的更多相关文章
- HDU 4767 Bell(矩阵+中国剩余定理)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4767 题意:给出n.求n有多少种划分集合的方式,即bell(n) 思路: #include <i ...
- 2013长春网赛1009 hdu 4767 Bell(矩阵快速幂+中国剩余定理)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4767 题意:求集合{1, 2, 3, ..., n}有多少种划分情况bell[n],最后结果bell[ ...
- hdu 4767 Bell
思路:矩阵快速幂+中国剩余定理!! 查资料得到2个公式: 1) B[n+p] = B[n] + B[n+1] mod p ; 2) B[p^m+n] = ...
- HDU 4767
昨晚苦恼了一晚,因为即将大三了,必须要准备实习什么的事了.一般都会去公司实习吧,但是看看自己的简历,实在拿不出手,因为大一大二都在搞ACM(虽然真正搞的只有大二一年),但却没有什么成绩,又不愿意做项目 ...
- Bell(hdu4767+矩阵+中国剩余定理+bell数+Stirling数+欧几里德)
Bell Time Limit:3000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status ...
- Bell(矩阵快速幂+中国剩余定理)
Bell Time Limit:3000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status ...
- hdu 5445 Food Problem 多重背包
Food Problem Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5 ...
- hdu 5445 多重背包
Food Problem Time Limit: 3000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)To ...
- HDU 2512 一卡通大冒险(第二类斯特林数+贝尔数)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2512 题目大意:因为长期钻研算法, 无暇顾及个人问题,BUAA ACM/ICPC 训练小组的帅哥们大部 ...
随机推荐
- 20155316 实验二《Java面向对象程序设计》实验报告
实验1 实验内容 参考 博客 完成单元测试的学习 提交最后三个JUnit测试用例(正常情况,错误情况,边界情况)都通过的截图,截图上要有画图加水印,输入自己的学号 本提交点考查JUnit会不会使用,测 ...
- OpenCV中Mat的属性
OpenCV中Mat的属性 最近在做一OpenCV的图像轮廓检验,但当用到霍夫变换时才发现对Mat的属性了解不足.Mat在OpenCV中的地位是及其重要的,因此有必要做一个总结. 大体上来说,Mat是 ...
- day6 角点检测
1.Harris角点检测 # coding=utf-8 import cv2 import numpy as np filename = 'pic5.png' #1.读入一个灰度图像 img = cv ...
- 【CF543E】Listening to Music
[CF543E]Listening to Music 题面 洛谷 题目大意 给你一个长度为\(n\)序列\(a_i\),和一个常数\(m\),定义一个函数\(f(l,x)\)为\([l,l+m-1]\ ...
- CF 1083 B. The Fair Nut and Strings
B. The Fair Nut and Strings 题目链接 题意: 在给定的字符串a和字符串b中找到最多k个字符串,使得不同的前缀字符串的数量最多. 分析: 建出trie树,给定的两个字符串就 ...
- 利用Anaconda进行python爬虫环境的配置-安装scrapy
1.下载Anaconda,下载地址:https://www.continuum.io/downloads 2.安装anaconda. 3.安装scrapy
- java生成pdf
介绍 本篇博客主要是为了介绍如何使用:flying-saucer+itext+freemark实现导出复杂点的pdf文件. 思路 先把pdf的内容以html形式准备好 使用freemarker将htm ...
- Linux的10个最危险的命令
Linux命令行佷有用.很高效,也很有趣,但有时候也很危险,尤其是在你不确定你自己在正在做什么时候. 这篇文章将会向你介绍十条命令,但你最好不要尝试着去使用. 当然,以下命令通常都是在root权限下才 ...
- sql server 批量备份数据库
很多时候,我们都需要将数据库进行备份,当服务器上数据库较多时,不可能一个数据库创建一个定时任务进行备份,这时,就需要进行批量的数据库备份操作,好了,废话不多说,具体实现语句如下: --开启文件夹权限 ...
- leetcode26_C++删除排序数组中的重复项
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成. 示例 1 ...