poj_1152_An Easy Problem!(进制)
2013-10-01 15:29
316 查看
题型:数论
题意:
给一个62进制数R,要找一个N,使得 R能转化为N进制数 并且 (n-1)|R,如果没有,则输出 "such number is impossible!"
分析:
假设输入R为abcd,若存在N,则有
(a*N^3+b*N^2+c*N+d)%(N-1)
= 0
=> (a*N^3%(N-1)+b*N^2%(N-1)+c*N%(N-1)+d%(N-1))%(N-1)
= 0
=> (a*N%(N-1)*N%(N-1)*N%(N-1)
+b*N%(N-1)*N%(N-1)
+c*N%(N-1)
+d) = 0
又因为 N%(N-1) = 1
所以 (a+b+c+d)%(N-1) = 0
注意点:
1、R中最大的一位数必须小于进制数。
代码:
题意:
给一个62进制数R,要找一个N,使得 R能转化为N进制数 并且 (n-1)|R,如果没有,则输出 "such number is impossible!"
分析:
假设输入R为abcd,若存在N,则有
(a*N^3+b*N^2+c*N+d)%(N-1)
= 0
=> (a*N^3%(N-1)+b*N^2%(N-1)+c*N%(N-1)+d%(N-1))%(N-1)
= 0
=> (a*N%(N-1)*N%(N-1)*N%(N-1)
+b*N%(N-1)*N%(N-1)
+c*N%(N-1)
+d) = 0
又因为 N%(N-1) = 1
所以 (a+b+c+d)%(N-1) = 0
注意点:
1、R中最大的一位数必须小于进制数。
代码:
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> using namespace std; char s[123456]; int main(){ while(~scanf("%s",s)){ int sum=0,h; int maxn=-1; int len=strlen(s); for(int i=0;i<len;i++){ if(s[i]>='0'&&s[i]<='9'){ h=s[i]-'0'; } else if(s[i]>='A'&&s[i]<='Z'){ h=s[i]-'A'+10; } else{ h=s[i]-'a'+36; } maxn=max(maxn,h); sum+=h; } int i; for(i=2;i<=62;i++){ if(sum%(i-1)==0 && maxn<i){ printf("%d\n",i); break; } } if(i>62) printf("such number is impossible!\n"); } return 0; }
相关文章推荐
- POJ 1152 An Easy Problem! (取模运算性质)
- POJ 1152 An Easy Problem! 笔记
- POJ 1152 An Easy Problem! (取模运算性质)
- POJ 1152 An Easy Problem!(进位制)
- POJ 1152 An Easy Problem
- Poj 1152 An Easy Problem!
- poj——1152——An Easy Problem!
- poj-1152 An Easy Problem!
- POJ-1152 An Easy Problem! 解题报告(数论) 是不是N进制数
- POJ 2826 An Easy Problem ?!
- [POJ] 2453 An Easy Problem [位运算]
- POJ 2826 An Easy Problem?![线段]
- POJ 2826 An Easy Problem?!
- POJ_2453_An Easy Problem(位运算神代码)
- POJ 2453 An Easy Problem G++
- poj 2826 An Easy Problem?!(线段直线相关应用)
- 【POJ 2826】An Easy Problem?!(几何、线段)
- POJ 2826 An Easy Problem? 判断线段相交
- POJ 2826 || an easy problem ?!(未AC,呵呵~
- POJ 2826 An Easy Problem?!(计算几何)