HDU 3240
求卡特兰数前N项的和模M。
直接求必定是不可能的,卡特兰数太大了。想了好久,本打算把位数拆成素数相乘,然后记录下各素数的个数计算。可惜,TLE。。。。因为N太大了。
除法必定是要用到逆元的,但分母与M不一定互质。M拆成素数相乘形式,记录下各个素数在数组PRIME。于是,可以把4*i-2和i+1拆成素数相乘,若在PRIME中,则必定是与M不互质的,只能将个数记在NUM中,4*i-2的+1,i+1的-1。那么,把各素数约去后的i-1剩下的必与M互质。于是就可以和M求逆元的。
可以看程序,很容易懂。
- #include <iostream>
- #include <cstdio>
- #include <algorithm>
- #include <cstring>
- #define LL __int64
- #define NP 30000
- using namespace std;
- LL prime[NP];
- int num[NP],np;
- void exgcd(__int64 a,__int64 b,__int64 &x,__int64 &y){
- if(b==0){
- x=1; y=0;
- return ;
- }
- exgcd(b,a%b,x,y);
- __int64 t=x;
- x=y;
- y=t-a/b*y;
- }
- void cal1(LL &ans,LL tp,LL &m){
- for(int i=0;i<np&&prime[i]<=tp;i++){
- if(tp%prime[i]==0){
- while(tp%prime[i]==0){
- num[i]++;
- tp/=prime[i];
- }
- }
- }
- ans=(ans*tp)%m;
- }
- void cal2(LL &ans,LL tp,LL &m){
- LL x,y;
- for(int i=0;i<np&&prime[i]<=tp;i++){
- if(tp%prime[i]==0){
- while(tp%prime[i]==0){
- num[i]--;
- tp/=prime[i];
- }
- }
- }
- exgcd(tp,m,x,y);
- ans=(ans*((x%m+m)%m))%m;
- }
- int main(){
- LL n,m;
- while(scanf("%I64d%I64d",&n,&m),n||m){
- LL tp=m; np=0;
- for(LL i=2;i*i<=tp;i++){
- if(tp%i==0){
- prime[np++]=i;
- while(tp%i==0)
- tp/=i;
- }
- }
- if(tp>1)
- prime[np++]=tp;
- memset(num,0,sizeof(num));
- LL ans=1,res=1,tmp;
- for(LL i=2;i<=n;i++){
- cal1(ans,4*i-2,m);
- cal2(ans,i+1,m);
- tmp=ans;
- for(int k=0;k<np;k++)
- if(num[k])
- for(int p=0;p<num[k];p++)
- tmp=(tmp*prime[k])%m;
- res=(res+tmp)%m;
- }
- printf("%I64d\n",res);
- }
- return 0;
- }
HDU 3240的更多相关文章
- HDU 4165
一块药看成括号配对就行了.很明显的直接求卡特兰数. 今晚看了HDU 3240的题,有一点思路,但无情的TLE.想不到什么好方法了,看了别人的解答,哇...简直是天才的做法啊....留到星期六自己思考一 ...
- HDU 4455.Substrings
Substrings Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- 转载:hdu 题目分类 (侵删)
转载:from http://blog.csdn.net/qq_28236309/article/details/47818349 基础题:1000.1001.1004.1005.1008.1012. ...
- hdu 1598 find the most comfortable road (并查集)
find the most comfortable road Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...
- HDOJ 2111. Saving HDU 贪心 结构体排序
Saving HDU Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 【HDU 3037】Saving Beans Lucas定理模板
http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...
- hdu 4859 海岸线 Bestcoder Round 1
http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...
- HDU 4569 Special equations(取模)
Special equations Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u S ...
- HDU 4006The kth great number(K大数 +小顶堆)
The kth great number Time Limit:1000MS Memory Limit:65768KB 64bit IO Format:%I64d & %I64 ...
随机推荐
- etymology-R
1)vor = to eat devour vt. 狼吞虎咽地吃光: 吞没,毁灭: 目不转睛地看[de-向下+vour-吃] voracity n.贪食,贪婪.拉丁词根vor-,vorac-表示吞食 ...
- HDU 1042 N!【大数】
N! Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) Total Subm ...
- iOS 相似QQ空间表视图下拉头部视图放大效果实现
UITableView 是 UIScrollView 的子类. 所以 UIScrollView 的代理方法.在UITableView 上相同可以得到适用. 既然如此那么我们就行知道.在表格下拉的过程中 ...
- codecombat之KithGard地牢19-37关代码分享
codecombat中国游戏网址:http://www.codecombat.cn/ 全部代码为javascript代码分享 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 19 ...
- js保留两位小数的解决的方法
var a = 123.456; a = a..toFixed(2); alert(a);//结果:123.46
- 0x29 总结与练习
搜索真的菜..困扰了很久,上个星期天没休息好导致整个礼拜没有精神.. 大概完成得七七八八了吧.真是深切的体会到暴力出奇迹的疯狂啊. 3.虫食算 从末位开始枚举判断,通过加数可以推出和的字母代表的数.那 ...
- 【刷题笔记】LeetCode 606. Construct String from Binary Tree
题意 给一棵二叉树,把它转化为字符串返回.转化字符串的要求如下: 1. null 直接转化为 () ;(这个要求其实有点误导人~) 2. 子节点用 () 包裹起来:(这是我自己根据例子添加的要求) ...
- svn插件失效
安装其他插件后,可能出现SVN插件失效了,在eclipse中完全找不到SVN的任何操作选项,此时可尝试通过以下办法解决: 把eclipse/configuration目录下的org.eclipse.u ...
- float类型和double类型的二进制存储
在32位环境下, float占用32位,double占用64位, 目前C/C++编译器标准都遵照IEEE制定的浮点数表示法来进行float,double运算.这种结构是一种科学计数法,用符号.指数和 ...
- [转]SQL Server 数据库规范
SQL Server 数据库规范 一. 命名规范常用对象命名规范,使用帕斯卡命名法(Pascal,单词首字母大写),统一使用英文. 1. 表.英文单数名词,尽量写完整单词名称一般不超过3个英文单词都可 ...