题目链接

http://acm.hdu.edu.cn/showproblem.php?pid=1104

在做这道题目一定要对同余定理有足够的了解,所以对这道题目对同余定理进行总结

首先要明白计算机里的取余计算和数学里的不一样的,计算机里的负数取余可以是负数的。例如-1%11=-1 而数学里的取余是-1%11=10

同余定理:

若a对d取余,和b对d取余的结果是相等的,那么称a,b对d是同余的。记作a≡b(mod d);这是数学里的定义。

下面看同余定理的几个性质:

1,a≡a(mod d) 数字和它本身是同余的

2,如果a≡b(mod d),b≡c(mod d);那么a≡c(mod d); 同余具有传递性、

3,如果a≡b(mod d),c≡e(mod d);那么a+c≡b+e(mod d);

4,如果a≡b(mod d),c≡e(mod d);那么a-c≡b-e(mod d);

5,如果a≡b(mod d),c≡e(mod d);那么a*c≡b*e(mod d);

6,如果ac≡bc(mod m) c!=0;那么 a≡b(mod m/gcd(c,m)) ;gcd(c,m)表示c,m的最大公约数。

7,如果a≡b(mod mi)(i=1,2,…..n) 则a≡b(mod [m1,m2…..mn]);[m1,m2…..mn]表示m1,m2….mn的最小公倍数

8,如果a≡b(mod m);那么a^n≡b^n(mod m);

以上的性质感觉做题目都没怎么用到,下面的倒是要经常用到

9,(a+b)≡((a%d)+(b%d))(mod d);

10,(a-b)≡((a%d)-(b%d))(mod d);

11,(a*b)≡((a%d)*(b%d))(mod d);

12,请特别注意%运算符不一定满足上面的性质

根据同余定理的性质给一道例题吧。

例题:求解2001 的2003 次方对13的取余数。

首先你可以算一下2001 对13取余的余数,发现是12 。那么根据性质8

2001^2003≡12^2003(mod 13).但是12^2003还是很大。一般可以是找12的几次方和1是对13同余的。可以找到12^2≡1(mod 13).

所以:(12^2)^1001≡1^1001(mod 13);

所以:(12^2)^1001*12≡1^1001*12(mod 13);

所以 12^2003≡12(mod 13).

接下来就是关于这道题目的,9,10,11,12 这四个性质。%不满足是因为%运算不像+,-,* 。例如a*b和b*a 的值是不变的,而a%b和b%a是改变的.我也说不出个所以然来,反正就是%运算会改变原本的状态。

解决办法就是倍增一下,把d变成d*b 那么(a%b)≡(((a%(b*d))%(b%(b*d)))(mod b*d).

#include <iostream>
#include <math.h>
#include <string.h>
#include <string>
#include <queue> using namespace std; int vis[1000010]; int n,k,m;
typedef struct Node
{
int num;
int step;
string way;
}Node;
int mod(int a,int b)
{
return (a%b+b)%b;
} void BFS()
{ Node * term=new Node;
Node *n1=new Node;
n1->num=n;
n1->step=0;
n1->way="";
memset(vis,0,sizeof(vis));
queue<Node*> Queue; Queue.push(n1);
while(!Queue.empty ())
{ term=Queue.front();
Queue.pop(); if(mod(term->num,k)==mod(n+1,k))
{
printf("%d\n",term->step);
cout<<term->way<<endl;
return;
}
if(vis[mod(term->num+m,k*m)]==0)
{
Node *p=new Node;
p->num=mod(term->num+m,k*m);
p->step=term->step+1;
p->way=term->way+"+";
Queue.push(p);
vis[mod(term->num+m,k*m)]=1;
}
if(vis[mod(term->num-m,k*m)]==0)
{
Node *p=new Node;
p->num=mod(term->num-m,k*m);
p->step=term->step+1;
p->way=term->way+"-";
Queue.push(p);
vis[mod(term->num-m,k*m)]=1;
}
if(vis[mod(term->num*m,k*m)]==0)
{
Node *p=new Node;
p->num=mod(term->num*m,k*m);
p->step=term->step+1;
p->way=term->way+"*";
Queue.push(p);
vis[mod(term->num*m,k*m)]=1;
}
if(vis[mod(mod(term->num,m),k*m)]==0)
{
Node *p=new Node;
p->num=mod(mod(term->num,m),k*m);
p->step=term->step+1;
p->way=term->way+"%";
Queue.push(p); vis[mod(mod(term->num,m),k*m)]=1;
}
}
puts("0");
return ; }
int main()
{
while(scanf("%d%d%d",&n,&k,&m)!=EOF)
{
if(n==0&&k==0&&m==0)
break;
BFS();
}
return 0;
}

HDU 1104 Remainder(BFS 同余定理)的更多相关文章

  1. hdu - 1104 Remainder (bfs + 数论)

    http://acm.hdu.edu.cn/showproblem.php?pid=1104 注意这里定义的取模运算和计算机的%是不一样的,这里的取模只会得到非负数. 而%可以得到正数和负数. 所以需 ...

  2. HDU 1104 Remainder (BFS(广度优先搜索))

    Remainder Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  3. HDU 1104 Remainder (BFS)

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1104 题意:给你一个n.m.k,有四种操作n+m,n-m,n*m,n%m,问你最少经过多少步,使得最后 ...

  4. HDU 1104 Remainder( BFS(广度优先搜索))

    Remainder Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  5. HDU 1104 Remainder (BFS求最小步数 打印路径)

    题目链接 题意 : 给你N,K,M,N可以+,- ,*,% M,然后变为新的N,问你最少几次操作能使(原来的N+1)%K与(新的N)%k相等.并输出相应的操作. 思路 : 首先要注意题中给的%,是要将 ...

  6. hdu.1104.Remainder(mod && ‘%’ 的区别 && 数论(k*m))

    Remainder Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total ...

  7. hdu 1104 数论+bfs

    Remainder Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total ...

  8. HDU 1104 Remainder

    与前一题类似,也是BFS+记录路径, 但是有很多BUG点, 第一MOD操作与%不同i,其实我做的时候注意到了我们可以这样做(N%K+K)%K就可以化为正数,但是有一点要注意 N%K%M!=N%M%K; ...

  9. POJ 1465 Multiple (BFS,同余定理)

    id=1465">http://poj.org/problem?id=1465 Multiple Time Limit: 1000MS   Memory Limit: 32768K T ...

随机推荐

  1. Android Activity 传递数据

    activity中数据的传递方式有2中,一种是使用putExtra()传递,另外一种是传递Bundle对象,使用putExtras()方法. 方法一 发送数据 putExtra()传送的是键值对,第一 ...

  2. nest(inner) class

    嵌套类,摘自: http://www.ntu.edu.sg/home/ehchua/programmin/java/J4a_GUI.html A nested class has these prop ...

  3. php如何定时执行任务

    PHP的实现决定了它没有Java和.Net这种AppServer的概念, 而http协议是一个无状态的协议, php只能被用户触发, 被调用, 调用后会自动退出内存, 没有常驻内存, 就没有办法准确的 ...

  4. ubuntu设置中文拼音输入法

    转载  http://www.cnblogs.com/zhj5chengfeng/archive/2013/06/23/3150620.html

  5. .net cs后台刷新aspx页面的四种方式

    一:Response.Redirect(Request.Url.ToString()); 二:Response.Write("<script language=javascript&g ...

  6. 对ChemDraw Prime 16.0你了解多少

    ChemDraw Prime 16.0应用是化学智能绘图程序的行业领导者.除了创建符合出版标准的绘图,化学家们可以使用ChemDraw Prime软件预测性能,搜索数据库等来节省时间,提高数据的准确性 ...

  7. tagVARIANT、VARIANT、_variant_t和COleVariant

    tagVARIANT是一个结构体struct:  C++ Code: tagVARIANT 123456789101112131415161718192021222324252627282930313 ...

  8. Credential

    https://www.cnblogs.com/Hawk-Hong/p/4293651.html 在项目开发,我们经常会使用WebService,但在使用WebService时我们经常会考虑以下问题: ...

  9. 如何才能知道外线是FSK还是DTMF制式?

    在直线上接上来电显示话机,然后用手机或其他电话拨接电话的外线号码. 1.如果是先振铃后来显,就是FSK制式. 2.如果先送来显,再振铃或来显和振铃同时响应,就是DTMF制式 交换机默认配置是FSK制式 ...

  10. laravel 发送邮件

    1)邮件配置(config/mail.php 配置文件) MAIL_DRIVER                       邮箱驱动,laravel 支持 "smtp", &qu ...