若是凉夜已成梦

青春里 总有些事情要努力去做 总有些梦想要拼命去追。


  • 运维

  • 前端

  • 编程

  • 随笔

  • hust-oj

1196: Eventually periodic sequence

发表于 2017-10-06   |   分类于 HUSTOJ   |   阅读次数 1,077

题目描述

Given is a function
f: 0..N –> 0..N
for a non-negative
N
and a non-negative integer
n
≤
N
. One can construct an infinite sequence
F = f 1(n), f 2(n), … f k(n) …
, where
f k(n)
is defined recursively as follows:
f 1(n) = f(n)
and
f k+1(n)
=
f(f k(n))
.
It is easy to see that each such sequence F is eventually periodic, that is periodic from some point onwards, e.g 1, 2, 7, 5, 4, 6, 5, 4, 6, 5, 4, 6 … . Given non-negative integer N ≤ 11000000 , n ≤ N and f, you are to compute the period of sequence F.
Each line of input contains N, n and the a description of f in postfix notation, also known as Reverse Polish Notation (RPN). The operands are either unsigned integer constants or N or the variable x. Only binary operands are allowed: + (addition), * (multiplication) and % (modulo, i.e. remainder of integer division). Operands and operators are separated by whitespace. The operand % occurs exactly once in a function and it is the last (rightmost, or topmost if you wish) operator and its second operand is always N whose value is read from input. The following function:

2 x * 7 + N %

is the RPN rendition of the more familiar infix
(2*x+7)%N
. All input lines are shorter than 100 characters. The last line of input has
N
equal 0 and should not be processed.
For each line of input, output one line with one integer number, the period of F corresponding to the data given in the input line.

输入

暂无

输出

暂无

样例输入

10 1 x N %
11 1 x x 1 + * N %
1728 1 x x 1 + * x 2 + * N %
1728 1 x x 1 + x 2 + * * N %
100003 1 x x 123 + * x 12345 + * N %
0 0 0 N %

样例输出

1
3
6
6
369

参考代码

#include <stdio.h>
#include <string.h>
#include <assert.h>
char op[101][101];
int i,j,k,n,N,no;
int eval(int x) 
{
    int i,j;
    int stack[101], n=0;
    for (i=0;i<no;i++) 
    {
        if (!strcmp(op[i],"x")) 
        {
            stack[n++] = x;
        } else if (!strcmp(op[i],"+")) 
        {
            stack[n-2] = (stack[n-2]+stack[n-1])%N;
            n--;
        } else if (!strcmp(op[i],"*")) 
        {
            stack[n-2] = ((long long)stack[n-2]*stack[n-1])%N;
            n--;
        } else 
        {
            stack[n++] = atoi(op[i]);
        }
    }
    assert (n == 1);
    return stack[0];
}
main() 
{
    int x,xx;
    while (2 == scanf("%d%d",&N,&n)&&N) 
    {
        for (i=0;1 == scanf("%s",op[i]) && strcmp(op[i],"%");i++);
        no = i-1;
        x = xx = n;
        for (j=1;;j++) 
        {
            x = eval(x);
            xx = eval(xx);
            xx = eval(xx);
            if (x == xx) 
            {
                for (k=1;x != (xx=eval(xx));k++);
                printf("%dn",k);
            break;
         }
      }
   }
}

解析

暂无

hustoj

发表评论 取消回复

电子邮件地址不会被公开。 必填项已用*标注

*
*


hoxis wechat
著作权归作者所有
站点更新说明
  • 文章目录
  • 站点概览
若是凉夜已成梦

若是凉夜已成梦

青春里 总有些事情要努力去做 总有些梦想要拼命去追。

1904 日志
6 分类
12 标签
RSS
weibo github twitter facebook

友情链接

原站点 Skip Dreams孤独患者
© 2017 若是凉夜已成梦
Powered by WordPress | 已运行
Theme By NexT.Mist