B-Casting
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 607 Accepted Submission(s): 303
Total Submission(s): 607 Accepted Submission(s): 303
Problem Description
Casting around for problems leads us to combine modular arithmetic with different integer bases, particularly the problem of computing values modulo b-1, where b is the base in which the value is represented. For example,
7829 10 mod 9 = 8,
37777777777777773 8 mod 7 = 6
123456 7 mod 6 = 3
(Note that 37777777777777773 8 = 1125899906842619 10 and 123456 7 = 22875 10.)
Your job is to write a program that reads integer values in various bases and computes the remainder after dividing these values by one less than the input base.
7829 10 mod 9 = 8,
37777777777777773 8 mod 7 = 6
123456 7 mod 6 = 3
(Note that 37777777777777773 8 = 1125899906842619 10 and 123456 7 = 22875 10.)
Your job is to write a program that reads integer values in various bases and computes the remainder after dividing these values by one less than the input base.
Input
The first line of input contains a single integer P, (1 <= P <= 1000) , which is the number o data sets that follow. Each data set should be processed identically and independently.
Each data set consists of a single line of input containing three space-separated values. The first is an integer which is the data set number. The second is an integer which is the number, B (2 <= B <= 10), denoting a numeric base. The third is an unsigned number, D, in base B representation. For this problem, the number of numeric characters in D will be limited to 10,000,000.
Each data set consists of a single line of input containing three space-separated values. The first is an integer which is the data set number. The second is an integer which is the number, B (2 <= B <= 10), denoting a numeric base. The third is an unsigned number, D, in base B representation. For this problem, the number of numeric characters in D will be limited to 10,000,000.
Output
For each data set there is a single line of output. It contains the data set number followed by a single space which is then followed by the remainder resulting from dividing D by (B-1).
Sample Input
4 1 10 7829 2 7 123456 3 6 432504023545112 4 8 37777777777777773
Sample Output
1 8 2 3 3 1 4 6
Source
Recommend
liuyiding
题意:
某一个很大的数,是由2到10的进制表示的,要将这个数取模,模数为该数进制减1。思路:
1.首先明确这个很大的数字要由__int64或longlong实现也是很困难的,所以需要用字符串来记录数字。
2.既然这个数不是以10进制表示,就不难想到要将它换成10进制数后再取模。
3.其他进制的数转换成10进制数是需要从个位开始逐位乘以该位的进制的次方数,如二进制数 110 = 0 * 2^0 + 1 * 2^1 +1 * 2^2 = 6
4.有了以上想法,就容易想到边求和变取模的思路
/*************************************************************************
> File Name: B.cpp
> Author: BSlin
> Mail:
> Created Time: 2013年10月06日 星期日 13时08分04秒
************************************************************************/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <iterator>
#include <vector>
#include <map>
#include <set>
#include <stack>
#include <queue>
#define MP make_pair
#define INF (1<<30)
#define PI acos(-1.0)
#define esp 1e-8
const int dx[4]={0,0,0,0};
using namespace std;
#define read freopen("in.txt","r",stdin)
#define write freopen("out.txt","w",stdout)
#if defined (_WIN32) || defined (__WIN32) || defined (WIN32) || defined (__WIN32__)
#define LL __int64
#define LLS "%" "I" "6" "4" "d"
#else
#define LL long long
#define LLS "%" "l" "l" "d"
#endif
#define M 10000010
char str[M];
int main(int argc, char** argv) {
//read;
int t,num,B,Bnum,len,ans,MOD;
scanf("%d",&t);
while(t--) {
scanf("%d %d %s",&num,&B,str);
//printf("%d %d %s\n",num,B,str);
len = strlen(str);
Bnum = 1;
MOD = B - 1;
ans = (str[len-1] - '0') % MOD;
for(int i=len-2; i>=0; i--) {
Bnum = Bnum * B % MOD;
ans = ((ans + (str[i] - '0') * Bnum % MOD) % MOD + MOD) % MOD;
}
printf("%d %d\n",num,ans);
}
return 0;
}