#数论-模运算#POJ 1150、1284、2115
1.POJ 1150 The Last Non-zero Digit #质因数分解+模运算分治#
先贴两份题解:
http://www.hankcs.com/program/algorithm/poj-1150-the-last-non-zero-digit.html
http://www.cppblog.com/abilitytao/archive/2009/10/31/99907.html
下面是自己看完题解(划掉)之后的理解:
题目要求出组合数Anm=n!/(n-m)!(说实话一开始不知道题目中的NPM到底什么意思。。)的最后一个非零位,那么可以来看看n!的最后一个非零位该如何求得。
求n!:
(1)首先,n!的所有10因子都是要去掉的(因为求非零位),那么2和5也要一对一对的去掉;
(2)接下来把数列分成奇数列:1 2 3 4 5 6 7 8 9 10 –> 1 3 5 7 9 | 2 4 6 8 10
故有f(n )=f(n/2 )+g(n );
g(n )可以再分为:1 3 5 7 9 11 13 17 19 21 ……和5的奇数倍 5 15 25……
故设这个数列中末尾为x(x=1,3,7,9)的个数 g(n,x )=n/10+(n%10>=x)+g(n/5,x );
(3)最后再对数列中末尾为2和5的个数进行比较、特判一下即可。
代码如下:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std; //计算n!中质因子(2/5)的出现次数
int get_2_5(int n,int num)
{
if(n==0) return 0;
return n/num+get_2_5(n/num,num);
} //计算奇数数列中末尾为x的数的出现次数
int g(int n,int x)
{
if(n==0) return 0;
return n/10+(n%10>=x)+g(n/5,x);
//数列还能再次分出子问题,故有g(n/5,x)
} //计算数列中末尾为x的数的出现次数
int getx(int n,int x)
{
if(n==0) return 0;
return getx(n/2,x)+g(n,x);
} int table[4][4]={
6,2,4,8,//2^n%10的循环节
1,3,9,7,//3
1,7,9,3,//7
1,9,1,9 //9
}; int main()
{
int n,m;
while(~scanf("%d %d",&n,&m))
{
int num2=get_2_5(n,2)-get_2_5(n-m,2);
int num5=get_2_5(n,5)-get_2_5(n-m,5);
int num3=getx(n,3)-getx(n-m,3);
int num7=getx(n,7)-getx(n-m,7);
int num9=getx(n,9)-getx(n-m,9); int res=1;
if(num2<num5)
{
printf("5\n");
continue;
}
else
{
if(num2!=num5)
{//if num2==num5 那么res应该*1
res*=table[0][(num2-num5)%4];
res%=10;
} res*=table[1][num3%4];
res%=10;
res*=table[2][num7%4];
res%=10;
res*=table[3][num9%4];
res%=10;
}
printf("%d\n",res);
}
}
2.POJ 1284 Primitive Roots #欧拉函数#
有一个关于原根的概念:若p有原根,则它恰有φ(φ( p))个不同的原根。
欧拉函数定义:对于正整数p,<=p且与p互质的正整数(包括1)的个数记作φ( p)。
这道题其实就是求欧拉数。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std; int Euler(int n)
{
int res=n;
for(int i=2;i*i<=n;i++)
{
while(n%i==0)
{
n/=i; res-=(res/i);
while(n%i==0)
n/=i;
}
}
if(n>1)
res-=(res/n);
return res;
} int main()
{
int p;
while(~scanf("%d",&p))
printf("%d\n",Euler(p-1));
return 0;
}
3.POJ 2115 C Looooops #扩展欧几里得#
http://blog.csdn.net/lyy289065406/article/details/6648546
题意:
对于C,for(i=A ; i!=B ;i +=C),在k位存储系统中循环几次才结束。
(若在有限次内结束,则输出循环次数n,否则输出FOREVER)
分析推导就直接看大牛的了,代码如下:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<string>
#include<cstdlib>
#include<vector>
#include<stack>
#include<map>
using namespace std;
typedef long long ll; ll extend_gcd(ll a,ll b,ll &x,ll &y)
{ //return d=gcd(a,n);
if(b==0)
{
x=1,y=0;
return a;
}
else
{
ll t=extend_gcd(b,a%b,x,y);
ll xx=x,yy=y;
x=yy;
y=xx-(a/b)*yy;
return t;
}
} int main()
{
ll A,B,C,k,x,y;
while(~scanf("%I64d %I64d %I64d %I64d",&A,&B,&C,&k))
{
if(A==0&&B==0&&C==0&&k==0) break;
ll a=C,b=B-A,n=(ll)1<<k; //n=2^k
ll d=extend_gcd(a,n,x,y); if(b%d!=0) //方程无解
printf("FOREVER\n");
else
{
x=(x*(b/d))%n; //x为方程ax=b(mod n)的最小解
x=(x%(n/d)+n/d)%(n/d); //x为方程ax=b(mod n)的最小整数解
printf("%I64d\n",x);
}
}
return 0;
}
#数论-模运算#POJ 1150、1284、2115的更多相关文章
- 数论 : 模运算法则(poj 1152)
题目:An Easy Problem! 题意:求给出数的最小进制. 思路:暴力WA: discuss中的idea: 给出数ABCD,若存在n 满足 (A* n^3 +B*n^2+C*n^1+D*n^0 ...
- POJ 1150 The Last Non-zero Digit 数论+容斥
POJ 1150 The Last Non-zero Digit 数论+容斥 题目地址: id=1150" rel="nofollow" style="colo ...
- poj 3980 取模运算
取模运算 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10931 Accepted: 6618 Description ...
- 最后一个非零数字(POJ 1604、POJ 1150、POJ 3406)
POJ中有些问题给出了一个长数字序列(即序列中的数字非常多),这个长数字序列的生成有一定的规律,要求求出这个长数字序列中某个位上的数字是多少.这种问题通过分析,找出规律就容易解决. 例如,N!是一个非 ...
- java 取模运算% 实则取余 简述 例子 应用在数据库分库分表
java 取模运算% 实则取余 简述 例子 应用在数据库分库分表 取模运算 求模运算与求余运算不同.“模”是“Mod”的音译,模运算多应用于程序编写中. Mod的含义为求余.模运算在数论和程序设计中 ...
- mysql中的优化, 简单的说了一下垂直分表, 水平分表(有几种模运算),读写分离.
一.mysql中的优化 where语句的优化 1.尽量避免在 where 子句中对字段进行表达式操作select id from uinfo_jifen where jifen/60 > 100 ...
- c++ 模运算
在数学里,"模运算"也叫"求余运算",用mod来表示模运算. 对于 a mod b 可以表示为 a = q(商)*b(模数) + r(余数),其中q表示商,b表 ...
- 二分求幂/快速幂取模运算——root(N,k)
二分求幂 int getMi(int a,int b) { ; ) { //当二进制位k位为1时,需要累乘a的2^k次方,然后用ans保存 == ) { ans *= a; } a *= a; b / ...
- Numpy 基本除法运算和模运算
基本算术运算符+.-和*隐式关联着通用函数add.subtract和multiply 在数组的除法运算中涉及三个通用函数divide.true_divide和floor_division,以及两个对应 ...
随机推荐
- MVC 5显示、创建、编辑、删除等功能实练
MVC 5显示.创建.编辑.删除等功能实练 在前天的学习小结中<15天学习MVC后的小结(分享经历与想法)>http://www.cnblogs.com/insus/p/3369870.h ...
- DSP TMS320C6000基础学习(4)—— cmd文件分析
DSP中的CMD文件是链接命令文件(Linker Command File),以.cmd为后缀. 在分析cmd文件之前,必需先了解 (1)DSP具体芯片的内存映射(Memory Map) (2)知道点 ...
- C++11改进我们的程序之简化我们的程序1
C++11改进我们的程序之简化我们的程序(一) C++11在很多方面可以简化我们的程序开发,我会在“简化我们的程序”这一系列的博文中一一讲到,敬请关注.这次要讲的是:C++11如何通过获取函数模板的返 ...
- javascript生成自定义的arcgis simpletoolbar
javascript生成自定义的arcgis simpletoolbar 最近在学习ARCGIS for Javascript过程中,在ESRI的在线帮助上看见了这样一个示例,查看源码后,觉得左侧工具 ...
- webservice 第一节 .net SoapHeader验证
在工作中经常用到webservice,在.net 开发中经常用到webservice,在java开发经常用到cxf. 今天闲置没事就介绍下 .net webservice中常用到 soapheader ...
- 一个意想不到的Javascript内存泄漏
原文:http://point.davidglasser.net/2013/06/27/surprising-javascript-memory-leak.html 本周我在Meter的同事追踪到了一 ...
- Android: Type Method 'NewStringUTF' could not be resolved
编译一个最简单的Android NDK 例子(android-ndk-r8/samples/hello-jni)出现了错误信息:Type Method 'NewStringUTF' could n ...
- [置顶] 关于UBUNTU 12.04, 在THINKPAD E430C上WIFI连接不上的问题
今天,把自己的本本给格式化了,化分成两个大块,在一切都搞定了后,出现了一个问题,即WIFI连接不上,但可以搜索到WIFI的网络,开始以为自己手贱,是不是密码输入了,试了N多次,发现偶错了,不是手贱,看 ...
- Hadoop完全分布式搭建过程中遇到的问题小结
前一段时间,终于抽出了点时间,在自己本地机器上尝试搭建完全分布式Hadoop集群环境,也是借助网络上虾皮的Hadoop开发指南系列书籍一步步搭建起来的,在这里仅代表hadoop初学者向虾皮表示衷心的感 ...
- [ios2]iOS 使用subversion管理iOS源代码 【转】
使用subversion管理iOS源代码 1.安装和配置subversion服务器 在windows 服务器上安装VisualSVN-Server,下载地址http://www.visualsvn.c ...