HDU 1104 Remainder (POJ 2426 BFS+数论)

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1104 http://poj.org/problem?id=2426 题目大意:给定三个数N, K, M,以及四种操作( + -  * %(数论取模) ) -> N = N opr M,求最少需要哪些操作能使得(最初的N+1) % K == (最后的N) % K 思路:理论上直接BFS就可以了.但是这道题存在很多trick.首先在搜索过程中的状态如果不取模可能会超int、long long,比如N*******…… 然后我们用到一个重要的取模技巧: 对于+ - * 来说取模是支持分配律的:              ( a + b ) % k = ( a % k + b % k ) % k              ( a - b ) % k = ( a % k - b % k ) % k              ( a * b ) % k = ( a % k * b % k ) % k 那么我们每次存储%k的数就行了. 但我们忘了一个%操作,即对于((n opr m)%k opr m) %k 是不是等于(n opr m opr m)%k,+ - * 都是满足的(用分配律证一下就行),但%不满足,所以我们不能%k,而是%km. 而且C++的%运算不是数论的取模,它的符号位取决于被模数,即它可能为负……所以需要改成( n % m + m ) % m 哎……为了这个C++的%和取模WA了一下午……sad……  

#include 
#include 
#include 
#include 
#include 
#define LL long long
using namespace std;
queue  Q;
queue  QS;
bool vis[1100000];

bool BFS(int res, int M, int K){
    int KM = K * M;
    while(!Q.empty()){
        int tmp = Q.front();
        string tmps = QS.front();
        Q.pop();
        QS.pop();
        if (vis[(tmp % K + K) % K]){
            continue ;
        }
        vis[(tmp % K + K) % K] = 1;
        if (((tmp % K + K) % K) == res){
            printf("%d\n", tmps.size());
            if (tmps.size() != 0)
                cout<
 

转载于:https://www.cnblogs.com/AbandonZHANG/archive/2012/12/25/4114188.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值