题意:

求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】大数计算器的更多相关文章

  1. BZOJ1300 [LLH邀请赛]大数计算器

    一开始以为暴力搞,后来看了数据范围还以为要FFT,各种被虐,然后Orz Seter大神!!! 我只想到了前三位:a * b <=> 10^(log(a) + log(b)),于是把乘的数都 ...

  2. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  3. C 语言快速入门,21 个小项目足矣!「不走弯路就是捷径」

    C 语言作为大学理工科专业的必修,是很多同学走进编程世界的第一课.那么怎样才能更好的入门 C 语言呢? 下面整理了 21 个 C 语言练手项目,从基础语法开始,逐步深入,通过一个个练手项目,让你轻松驰 ...

  4. 杭电HDOJ--ACM1002(JAVA解题,运用BigInteger)(自定义MBigInteger 简单实现大数处理----完善后可以实现百亿计算器)

    转载声明:原文转自http://www.cnblogs.com/xiezie/p/5501901.html     JAVA解题:   import java.util.*; import java. ...

  5. 支持无限精度无限大数的类BigNumber实现

    介绍 本篇是MathAssist的第二篇,在前言中粗略地展示了MathAssist的“计算和证明”能力,本篇开始将详细介绍其实现原理. 从计算开始说起,要实现任意大数的计算器首先得有一个类支持大数运算 ...

  6. C#实现任意大数的计算和简单逻辑命题的证明——前言

    介绍 这是本人毕业设计的项目,一直想将其整理成文,可一不小心4年就过去了(这个时间又可以读个大学了).现在给自己定一个目标,一个月时间里将项目的所有关键点都整理出来.不然真怕一眨眼又一个4年过去了,而 ...

  7. Java SWT 做计算器。

    java  --  swt  - -  计算器 环境搭建 安装java.eclipse.以及对应的swt插件. 开始工程 建立工程: 在java下建立一个在其他 —- WindowsBuilder — ...

  8. ACM题目————小A的计算器

    Description 以往的操作系统内部的数据表示都是二进制方式,小A新写了一个操作系统,系统内部的数据表示为26进制,其中0-25分别由a-z表示.  现在小A要在这个操作系统上实现一个计算器,这 ...

  9. BigInteger大数家法源代码及分析

    我们可以把一个很大很长的数分成多个短小的数,然后保存在一个数组中,大数之间的四则运算及其它运算都是通过数组完成.JDK就是这么实现的.JDK的BigInteger类里用一个int数组来保存数据: /* ...

随机推荐

  1. sort-based shuffle的核心:org.apache.spark.util.collection.ExternalSorter

    依据Spark 1.4版 在哪里会用到它 ExternalSorter是Spark的sort形式的shuffle实现的关键.SortShuffleWriter使用它,把RDD分区中的数据写入文件. o ...

  2. 服务器程序源代码分析之三:gunicorn

    服务器程序源代码分析之三:gunicorn 时间:2014-05-09 11:33:54 类别:网站架构 访问: 641 次 gunicorn是一个python web 服务部署工具,类似flup,完 ...

  3. hdu 3032 Nim or not Nim? 博弈论

     这题是Lasker’s Nim. Clearly the Sprague-Grundy function for the one-pile game satisfies g(0) = 0 and g( ...

  4. 使用Data Annotations进行手动数据验证

    Data Annotations是在Asp.Net中用于表单验证的 它通过Attribute直接标记字段的有效性,简单且直观.在非Asp.Net程序中(如控制台程序),我们也可以使用Data Anno ...

  5. [模拟]ZOJ3485 Identification Number

    题意:给了一串15位或18位的身份证号码,求 在改变最少位数的情况下, 输出正确合法的身份证号 合法的身份证 是按照以下规则: 前6位以及“Order code”三位  一定合法 其中X是根据前17位 ...

  6. orm框架的学习mybatis

    1.数据库中的每张表,对应代码 中一个pojo类. 2.or映射是在mapper.xml文件中,指定resultType.可以指定已经定义的pojo类. 3.可以利用paramaterType指定sq ...

  7. live555源码研究(一)------live555MediaServer的启动过程和基本类图

    live555MediaServer.cpp就是live555服务器启动的过程. 一.启动过程 1,构造运行环境,运行环境包括了TaskScheduler 2,构造鉴权数据,也就是登陆的用户名和密码等 ...

  8. ERDAS IMAGINE 9.2安装破解方法

    Install the application. Copy the license.dat and ERDAS.exe to C:\Program Files\Leica Geosystems\Sha ...

  9. Java API ——Character类

    1.Character类的概述 · Character 类在对象中包装一个基本类型 char 的值 · 此外,该类提供了几种方法,以确定字符的类别(小写字母,数字,等等),并将字符从大写转换成小写,反 ...

  10. c++ const 关键字 学习笔记

    const简单介绍: 1不再使用c中的#define,c++默认不给const定义的变量分配内存,所以它默认的是仅本文件可以看到该变量(即internal linkage), const int bu ...