【rqnoj】pid729 / 相同的后k位-凯发app官方网站

凯发app官方网站-凯发k8官网下载客户端中心 | | 凯发app官方网站-凯发k8官网下载客户端中心
  • 博客访问: 752900
  • 博文数量: 144
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1150
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-17 14:32
个人简介

小公司研发总监,既当司令也当兵!

文章分类

全部博文(144)

相关博文
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·

分类: linux

2017-06-05 15:28:23

题目描述

路人甲给你出了一道奇怪的问题,他给你了一个正整数l,他想知道当正整数m,n为何值时,l^m与l^n的最后k位数字相同。

路人甲考虑到可能会有很多组解,你只需要告诉他最小的m,n且0 为了降低难度,我们约定: 100<=l<=9999  并且 1<=k<=4

分析:

1.“l^m与l^n的最后k位数字相同”等价于:
(l^m)%(10^k) ==  (l^n)%(10^k), 其中m~=n

2. 考虑到m稍大时,(l^m)将会是一个非常大的数,会导致大数溢出,那么遍历(l^m)将不现实。

3. 假设,l%m=c,那么一定存在整数t使得:l = t*m c
从而有: 
        (l*n)%m = ((t*m c)*n) %m = (t*n*m)%m (c*n)%m = (c*n)%m
即: (l*n)%m =  (c*n)%m

记 f(n) = (l^m)%m, 结合上面分析,我们可以得到:
f(n) = l %m (n =1)
f(n) = (f(n-1) * l) %m (n >=2)
对于任意正整数n, f(n) < m恒成立

按照题目描述,m=10^k, 对于有界的k,那么m是有界的。又由于 f(n) < m恒成立,即f(n)的值域为 [0,m-1], 可以推出当n取值为[1,m 1]时,对应的f(n)至少有一组重复。

用数组s[m 1]记录f(n)的遍历情况(1到m 1):
1)初始化s[i] = 0
2)  对于任意n,如果s[f(n)] ~= 0,那么说明存在i < n, 并且 f(i) == f(n),遍历结束,i和n即我们需要的答案;否则记录s[f(n)] = n


实现

点击(此处)折叠或打开

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<stdlib.h>

  4. #define llong long long

  5. static llong power(long key, int n)
  6. {
  7.     int i;
  8.     llong ret = 1;
  9.     for (i = 0; i < n; i)
  10.         ret *= key;
  11.     return ret;
  12. }

  13. static void printks(int base, int len)
  14. {
  15.     int hashlen;
  16.     short* rcd;
  17.     int cur = 1;
  18.     int carry = base;
  19.     
  20.     if (base < 100 || base >= 10000 || len < 0 || len > 4)
  21.     {
  22.         printf("invaild input\n");
  23.         return;
  24.     }
  25.      hashlen = power(10,len);
  26.     rcd = (short*)calloc(sizeof(short), hashlen 1);
  27.     if (!rcd)
  28.         return;

  29.     while(carry < hashlen)
  30.     {
  31.         carry *= base;
  32.         cur;        
  33.     }

  34.     carry = carry % hashlen;
  35.     rcd[carry] = cur;

  36.     while (cur <= hashlen)
  37.     {
  38.         cur;
  39.         carry = (carry * base) % hashlen;
  40.         if (rcd[carry] > 0)
  41.         {
  42.             printf("%d, %d\n", cur, rcd[carry]);
  43.             return;
  44.         }
  45.         else
  46.         {
  47.             rcd[carry] = cur;
  48.         }
  49.     }
  50. }

  51. int main(int argc, char** argv)
  52. {
  53.     int base;
  54.     int len;

  55.     scanf("%d %d", &base, &len);
  56.     printf("--%d %d\n", base, len);
  57.     printks(base, len);
  58.     return 0;
  59. }


阅读(2391) | 评论(0) | 转发(0) |
0

上一篇:lua math 库

下一篇:【rqnoj】pid4 / 数列

给主人留下些什么吧!~~
")); function link(t){ var href= $(t).attr('href'); href ="?url=" encodeuricomponent(location.href); $(t).attr('href',href); //setcookie("returnouturl", location.href, 60, "/"); }
网站地图