HDU 1104 Remainder (POJ 2426 BFS+数论)
2012-12-25 17:31
417 查看
题目链接: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……
[code]
#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<
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……
[code]
#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<
相关文章推荐
- HDU 1104 Remainder (POJ 2426 BFS+数论)
- hdu 1104/poj 2426 Remainder
- hdu 1104 Remainder(BFS+数论)
- hdu 1104 Remainder 【广度优先搜索+数论】
- HDU 1104 Remainder(BFS打印路径+数论)(%与mod的区别)
- hdu 1104/poj 2426 Remainder(数论,BFS)
- hdu-1104-Remainder(BFS打印路径+数论)(%与mod的区别)
- hdu - 1104 Remainder (bfs + 数论)
- hdu1104 Remainder bfs找算式是否有解……
- poj1482 & hdu1818 It's not a Bug, It's a Feature!(bfs+状态压缩)
- hdu 1104 Remainder 队列
- POJ 2282 && HDU 1663 The Counting Problem(数论)
- POJ 3696/ HDU 2462 The Luckiest number (数论)
- hdu 1104 Remainder 队列
- hdu 1104 Remainder
- HDU 1104 Remainder (BFS)
- hdu 1104 BFS + 数论
- HDU 1104 Remainder
- HDOJ1104 Remainder(数论+BFS)
- HDU 1104 Remainder