九度oj 题目1085:求root(N, k) 清华2010年机试题目

题目描述:

N<k时,root(N,k) = N,否则,root(N,k) = root(N‘,k)。N‘为N的k进制表示的各位数字之和。输入x,y,k,输出root(x^y,k)的值 (这里^为乘方,不是异或),2=<k<=16,0<x,y<2000000000,有一半的测试点里 x^y 会溢出int的范围(>=2000000000)

输入:

每组测试数据包括一行,x(0<x<2000000000), y(0<y<2000000000), k(2<=k<=16)

输出:

输入可能有多组数据,对于每一组数据,root(x^y, k)的值

样例输入:
4 4 10
样例输出:
4

这道题我苦思冥想了很久,最令我头疼的就是数据的范围,2000000000的2000000000次方该有多大,如何去计算?每次都要求N的k进制表示的各位数字之和,那么一要取模,二要求除法,这么大的数怎么做。题目考的一定不是大数的运算,肯定存在某种规律,那么这种规律是什么?

在思考的过程中,首先考虑了 1. (a*b)mod N = (a * (b mod N)) mod N;其次也考虑到了
每次都要求N的k进制表示的各位数字之和,那么最后的那个和就是 2. N mod (k-1)  (这个是凭找规律看出来的)

但接下来自己的思路就比较混乱,不知道该怎么处理x的y次方的问题,想了很久也没有想出来。

最后忍不住看了看其他人的题解,他们确实求了x的y次方,而且用的是反复平方法来求,并且在求的过程中直接做取模运算,避免了数据溢出。差距就在这里。代码如下
 1 #include <cstdio>
 2 #include <cstring>
 3
 4 typedef long long ll;
 5
 6
 7 int root(ll x, ll y, ll k) {
 8     ll mi = 1;
 9     while (y) {
10         if (y & 1) {
11             mi = (mi*x) % k;
12         }
13         x = (x * x)%k;
14         y = y >> 1;
15     }
16     return mi;
17 }
18
19 int main() {
20     ll x, y, k;
21     while (scanf("%lld %lld %lld", &x, &y, &k) != EOF) {
22         ll ans = root(x, y, k-1);
23         if (ans == 0) {
24             ans = k - 1;
25         }
26         printf("%lld\n", ans);
27     }
28     return 0;
29 }
关于第2点
    N=a0+a1*k+a2*k^2+……an*k^n

      N‘=a0+a1+a2+……+an

      N-N‘=a1*(k-1)+a2*(k-1)^2+a3*(k-1)^3+......+an*(k-1)^n

      (N-N‘)%(k-1)=0

      (N‘-N‘‘)%(k-1)=0

     .....

      (N(r-1)-N(r))%(k-1)=0

      相加得(N-N(r))%(k-1)=0

      N(r)=N%(k-1)

      故(x^y)%(k-1)就是我们要求的。

      当(x^y)%(k-1)=0时,注意结果为k-1

时间: 2024-12-28 17:47:45

九度oj 题目1085:求root(N, k) 清华2010年机试题目的相关文章

九度[1085]求root(N,K)

1 # include<iostream> 2 using namespace std; 3 int main(){ 4 long long int x=0,y=0,k=0; 5 while(cin>>x>>y>>k) 6 { 7 long long int sum=1; 8 k--; 9 while(y) 10 { 11 if(y%2!=0) sum=(sum*x)%k; 12 x=(x*x)%k; 13 y=y/2; 14 } 15 if(sum==0)

九度oj 题目1083:特殊乘法 清华大学2010年机试题目

题目描述: 写个算法,对2个小于1000000000的输入,求结果. 特殊乘法举例:123 * 45 = 1*4 +1*5 +2*4 +2*5 +3*4+3*5 输入: 两个小于1000000000的数 输出: 输入可能有多组数据,对于每一组数据,输出Input中的两个数按照题目要求的方法进行运算后得到的结果. 样例输入: 123 45 样例输出: 54 简单题,拿来找手感 1 #include <cstdio> 2 #include <cstring> 3 4 char a[12

九度oj 题目1084:整数拆分 清华大学2010年机试题目

题目描述: 一个整数总可以拆分为2的幂的和,例如:7=1+2+4 7=1+2+2+2 7=1+1+1+4 7=1+1+1+2+2 7=1+1+1+1+1+2 7=1+1+1+1+1+1+1总共有六种不同的拆分方式. 再比如:4可以拆分成:4 = 4,4 = 1 + 1 + 1 + 1,4 = 2 + 2,4=1+1+2. 用f(n)表示n的不同拆分的种数,例如f(7)=6.要求编写程序,读入n(不超过1000000),输出f(n)%1000000000. 输入: 每组输入包括一个整数:N(1<=

九度oj 1468 Sharing 2012年浙江大学计算机及软件工程研究生机试真题

题目1468:Sharing 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:2687 解决:550 题目描述: To store English words, one method is to use linked lists and store a word letter by letter. To save some space, we may let the words share the same sublist if they share the same suffix.

九度oj 1002 Grading 2011年浙江大学计算机及软件工程研究生机试真题

1 #include<iostream> 2 #include<queue> 3 #include<cstdio> 4 #include<cstring> 5 #include<cmath> 6 #include<algorithm> 7 using namespace std; 8 int map[15][15]; 9 int main(){ 10 int P,T,G1,G2,G3,GJ; 11 while(cin>>P

九度oj 1004 Median 2011年浙江大学计算机及软件工程研究生机试真题

题目1004:Median 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:14162 解决:3887 题目描述: Given an increasing sequence S of N integers, the median is the number at the middle position. For example, the median of S1={11, 12, 13, 14} is 12, and the median of S2={9, 10, 15, 16, 1

九度oj 1032 ZOJ 2009年浙江大学计算机及软件工程研究生机试真题

题目1032:ZOJ 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4102 解决:2277 题目描述: 读入一个字符串,字符串中包含ZOJ三个字符,个数不一定相等,按ZOJ的顺序输出,当某个字符用完时,剩下的仍然按照ZOJ的顺序输出. 输入: 题目包含多组用例,每组用例占一行,包含ZOJ三个字符,当输入“E”时表示输入结束.1<=length<=100. 输出: 对于每组输入,请输出一行,表示按照要求处理后的字符串.具体可见样例. 样例输入: ZZOOOJJJ ZZZZOOOOO

九度OJ 1085 清华大学2010机试《求root(N,k)》

题目1085:求root(N, k) 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1191 解决:443 题目描述: N<k时,root(N,k) = N,否则,root(N,k) = root(N',k).N'为N的k进制表示的各位数字之和.输入x,y,k,输出root(x^y,k)的值 (这里^为乘方,不是异或),2=<k<=16,0<x,y<2000000000,有一半的测试点里 x^y 会溢出int的范围(>=2000000000) 输入: 每组测

九度oj 题目1546:迷宫问题 (概率dp guess消元)

题目链接:点击打开链接 题目描述: 给定一个n*m的迷宫,如 S.. ..# E.E 其中,S代表开始位置,#代表不可行走的墙,E代表出口. 主人公从开始位置出发,每次等概率的随机选择下一个可以行走的位置,直到到达某一个出口为止. 现在他想知道,在这一概率事件中,它从开始位置走到某一个出口的期望步数是多少. 输入: 输入包含多组测试用例,每组测试用例由两个整数n,m(1<=n,m<=15)开始,代表迷宫的大小 接下去n行每行m个字符描述迷宫信息,具体规则如题面所述. 数据保证至少存在一个E和一