【bzoj1300】大数计算器
2013-10-19 15:56
190 查看
题意:
求C(n,m) 如果C(n,m)的位数<=12 那么直接输出 否则按XXX...XXXXXXXXX的形式输出
题解:
这题之前打过 但是昨天又想出一种新的做法 先说下新的做法吧- -
________________(坑爹的博客园出现了一些bug 不能显示回车 so 我是华丽的分割线)________________
首先要知道位数 显然可以用res存 如果是乘的res就加log(10,x) 除的就减掉
如果res<13那么暴力算 直接输出就完了
如果res>=13 就要知道前3位 和答案模10^10的值
前3位很简单 把res的整数部分边成2 10^res的整数部分就是前3位
后面要算C(n,m)%10^10的值 我们发现10^10=(2^10)*(5^10)
就把要乘或除的数a 转换成a=a'*(2^x)*(5^y) (a',10)=1
把2和5的次方分离出来算 那么就能保证运算的数都和10^10互质 就能用乘法逆元了
_________________________________________________________________________________
但是这有个问题- -
10^10*10^10可能会爆long long
对这问题有两种办法解决
1.高精 不解释
2.分别算模2^10 和模5^10 最后线性模方程算答案
鉴于这两种方法都听难打 而且bzoj还把这题变成高富帅题 于是我放弃治疗了- -
_________________________________________________________________________________
正解:
我们可以把每个数都分解质因数 因为n和m都比较小 所以可以把每个质数的指数都存下来 最后统一算就完了
_________________________________________________________________________________
代码:
View Code
求C(n,m) 如果C(n,m)的位数<=12 那么直接输出 否则按XXX...XXXXXXXXX的形式输出
题解:
这题之前打过 但是昨天又想出一种新的做法 先说下新的做法吧- -
________________(坑爹的博客园出现了一些bug 不能显示回车 so 我是华丽的分割线)________________
首先要知道位数 显然可以用res存 如果是乘的res就加log(10,x) 除的就减掉
如果res<13那么暴力算 直接输出就完了
如果res>=13 就要知道前3位 和答案模10^10的值
前3位很简单 把res的整数部分边成2 10^res的整数部分就是前3位
后面要算C(n,m)%10^10的值 我们发现10^10=(2^10)*(5^10)
就把要乘或除的数a 转换成a=a'*(2^x)*(5^y) (a',10)=1
把2和5的次方分离出来算 那么就能保证运算的数都和10^10互质 就能用乘法逆元了
_________________________________________________________________________________
但是这有个问题- -
10^10*10^10可能会爆long long
对这问题有两种办法解决
1.高精 不解释
2.分别算模2^10 和模5^10 最后线性模方程算答案
鉴于这两种方法都听难打 而且bzoj还把这题变成高富帅题 于是我放弃治疗了- -
_________________________________________________________________________________
正解:
我们可以把每个数都分解质因数 因为n和m都比较小 所以可以把每个质数的指数都存下来 最后统一算就完了
_________________________________________________________________________________
代码:
#include <cstdio> #include <cmath> using namespace std; typedef long long ll; const ll mo=1000000000000ll; ll n,m,ans=1,num,sum[1000001],bo[1000001],primer[1000001],ns; double save; ll power(ll a,ll b){ ll res=1; for (;b;b>>=1){ if (b&1) res=res*a%mo; a=a*a%mo; } return res; } void makepr(ll t){ for (ll i=2;i<=t;i++){ if (!bo[i]) primer[++ns]=i; for (ll j=1;j<=ns && i*primer[j]<=t;j++){ bo[i*primer[j]]=1; if (i%primer[j]==0) break; } } } int main(){ freopen("bz1300.in","r",stdin); freopen("bz1300.out","w",stdout); ll i,j; scanf("%I64d%I64d\n",&n,&m); makepr(n); for (i=1;i<=ns;i++){ for (j=primer[i];j<=n;j*=primer[i]) sum[i]+=n/j; for (j=primer[i];j<=m;j*=primer[i]) sum[i]-=m/j; for (j=primer[i];j<=n-m;j*=primer[i]) sum[i]-=(n-m)/j; } for (i=1;i<=ns;i++) if (sum[i]){ ans=(ans*power(primer[i],sum[i]))%mo; save+=log10(primer[i])*sum[i]; } if (save<12) printf("%I64d",ans); else{ long double ans2=pow(10,save-static_cast<int>(std::floor(save))+2); printf("%I64d...%I64d",static_cast<ll>(floor(ans2)),ans%(mo/1000)); } fclose(stdin); fclose(stdout); }
View Code
相关文章推荐
- 【BZOJ1300】[LLH邀请赛]大数计算器【快速幂】【姿势】
- BZOJ1300 [LLH邀请赛]大数计算器
- bzoj1300: [LLH邀请赛]大数计算器
- BZOJ 1854 [Scoi2010] 游戏 题解与分析
- BZOJ 2780 SPOJ 8093 Sevenk Love Oimaster 后缀自动机+fenwick
- [BZOJ1013][JSOI2008]球形空间产生器sphere
- 【动态规划】[BZOJ1037][ZJOI2008]生日聚会Party
- bzoj 1725: [Usaco2006 Nov]Corn Fields牧场的安排(状压DP)
- BZOJ 1123 BLO
- BZOJ 1036: [ZJOI2008]树的统计Count (树链剖分+线段树)
- [分块] BZOJ 2724 [Violet 6]蒲公英
- [BZOJ2196]Brownie Slicing 二分答案
- BZOJ 3629 [JLOI2014] 聪明的燕姿 dfs
- [BZOJ]3143 游走 期望 + 高斯消元
- 【BZOJ4424】Cf19E Fairy DFS树
- [国家集训队][bzoj 2152] 聪聪可可 [点分治]
- BZOJ_3786_星系探索_splay维护出栈入栈序
- 1049: [HAOI2006]数字序列 - BZOJ
- bzoj 1576: [Usaco2009 Jan]安全路经Travel 树链剖分
- bzoj3211 花神游历各国