【bzoj1300】大数计算器
题意:
求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=,num,sum[],bo[],primer[],ns;
- double save;
- ll power(ll a,ll b){
- ll res=;
- for (;b;b>>=){
- if (b&) res=res*a%mo;
- a=a*a%mo;
- }
- return res;
- }
- void makepr(ll t){
- for (ll i=;i<=t;i++){
- if (!bo[i]) primer[++ns]=i;
- for (ll j=;j<=ns && i*primer[j]<=t;j++){
- bo[i*primer[j]]=;
- if (i%primer[j]==) 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=;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=;i<=ns;i++)
- if (sum[i]){
- ans=(ans*power(primer[i],sum[i]))%mo;
- save+=log10(primer[i])*sum[i];
- }
- if (save<) printf("%I64d",ans);
- else{
- long double ans2=pow(,save-static_cast<int>(std::floor(save))+);
- printf("%I64d...%I64d",static_cast<ll>(floor(ans2)),ans%(mo/));
- }
- fclose(stdin);
- fclose(stdout);
- }
【bzoj1300】大数计算器的更多相关文章
- BZOJ1300 [LLH邀请赛]大数计算器
一开始以为暴力搞,后来看了数据范围还以为要FFT,各种被虐,然后Orz Seter大神!!! 我只想到了前三位:a * b <=> 10^(log(a) + log(b)),于是把乘的数都 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- C 语言快速入门,21 个小项目足矣!「不走弯路就是捷径」
C 语言作为大学理工科专业的必修,是很多同学走进编程世界的第一课.那么怎样才能更好的入门 C 语言呢? 下面整理了 21 个 C 语言练手项目,从基础语法开始,逐步深入,通过一个个练手项目,让你轻松驰 ...
- 杭电HDOJ--ACM1002(JAVA解题,运用BigInteger)(自定义MBigInteger 简单实现大数处理----完善后可以实现百亿计算器)
转载声明:原文转自http://www.cnblogs.com/xiezie/p/5501901.html JAVA解题: import java.util.*; import java. ...
- 支持无限精度无限大数的类BigNumber实现
介绍 本篇是MathAssist的第二篇,在前言中粗略地展示了MathAssist的“计算和证明”能力,本篇开始将详细介绍其实现原理. 从计算开始说起,要实现任意大数的计算器首先得有一个类支持大数运算 ...
- C#实现任意大数的计算和简单逻辑命题的证明——前言
介绍 这是本人毕业设计的项目,一直想将其整理成文,可一不小心4年就过去了(这个时间又可以读个大学了).现在给自己定一个目标,一个月时间里将项目的所有关键点都整理出来.不然真怕一眨眼又一个4年过去了,而 ...
- Java SWT 做计算器。
java -- swt - - 计算器 环境搭建 安装java.eclipse.以及对应的swt插件. 开始工程 建立工程: 在java下建立一个在其他 —- WindowsBuilder — ...
- ACM题目————小A的计算器
Description 以往的操作系统内部的数据表示都是二进制方式,小A新写了一个操作系统,系统内部的数据表示为26进制,其中0-25分别由a-z表示. 现在小A要在这个操作系统上实现一个计算器,这 ...
- BigInteger大数家法源代码及分析
我们可以把一个很大很长的数分成多个短小的数,然后保存在一个数组中,大数之间的四则运算及其它运算都是通过数组完成.JDK就是这么实现的.JDK的BigInteger类里用一个int数组来保存数据: /* ...
随机推荐
- sequel 连接不上,命令行能连上
Sequel pro won't connect anymore I'm running into some trouble right now. I worked yesterday on my d ...
- CentOS7.1配置远程桌面
网上看了很多资料,完全是乱的. 我使用的是CentOS7.1的系统.我的要求是windows的客户机可以远程访问CentOS系统. 1,首先需要检查一下服务器是否已经安装了VNC服务,检查服务器的是否 ...
- Power Station POJ 4045
题意:给你一棵树,让你求一点,使该点到其余各点的距离之和最小.如果这样的点有多个,则按升序依次输出. 树型dp #include <cstdio> #include <cstring ...
- web.xml的说明
<!--DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. Copyright 2000-2007 Sun Microsystems ...
- Git教程(8)Git几种工作方式
1,集中共享式(1个仓库) 其中角色: 1个远程仓库,N个开发者. 工作方式: 集中式系统:所有开发者共享同一个远程仓库.每次推送数据到远程仓库时都要先更新一下. 利用 Git 的分支模型,通过同时在 ...
- IMX51启动模式
相关链接: http://blog.csdn.net/kickxxx/article/details/7236040 http://blog.csdn.net/evilcode/article/det ...
- 【HDOJ】2242 考研路茫茫——空调教室
tarjan缩点,然后树形dp一下可解.重点是重边的处理. /* 2242 */ #include <iostream> #include <sstream> #include ...
- Java数据库增删改查
数据库为MySQL数据库,Oracle数据库类似: create database db_test;--创建数据库 ';--创建用户 grant all privileges on db_test.* ...
- poj 2488 A Knight's Journey( dfs )
题目:http://poj.org/problem?id=2488 题意: 给出一个国际棋盘的大小,判断马能否不重复的走过所有格,并记录下其中按字典序排列的第一种路径. #include <io ...
- 对于requirejs AMD模块加载的理解
个人人为使用模块化加载的优点有三: 1,以我的项目为例:90%为图表展示,使用的是echarts,此文件较大,requirejs可以在同一个版本号(urlArgs)之下缓存文件,那么我就可以在访问登陆 ...