X-Sequence

181. X-Sequence

time limit per test: 0.25 sec. 
memory limit per test: 4096 KB
input: standard 

output: standard

Let {x i} be the infinite sequence of integers:
1) x 0 = A;
2) x i = (alpha * x i-1^2 + beta * x i-1 + gamma) mod M, for i >= 1.
Your task is to find x k if you know A, alpha, beta, gamma, M and k.

Input

Given A (1 <= A <= 10000), alpha (0 <= alpha <= 100), beta (0 <= beta <= 100), gamma (0 <= gamma <= 100), M (1 <= M <= 1000), k (0 <= k <= 10^9). All numbers are integer.


Output

Write x k.

Sample test(s)


Input

1 1 1 1 10 1

Output

3


1,查找循環節。考慮特殊的不是從第一位開始循環的情況(9,8,5,4,3,5,4,3,5,4,3)//從第3位開始循環,循環節爲3,循環數字爲5.4.3

#include<stdio.h>  
#include<string.h>  
int main()  
{  
    int A, alpha, beta, gamma, M , k;  
    int loop,i,t;  
    int num[1010];  
    int visit[10100];  //visit用來標記是否num[i]的值是否出現過即visit[num[i]]是否是-1   
    while(~scanf("%d%d%d%d%d%d",&A,&alpha,&beta,&gamma,&M,&k))  
    {  
          
        memset(visit,-1,sizeof(visit));  
        num[0]=A;visit[A]=0;  
        for(i=1;;i++)  
        {  
            num[i]=alpha*num[i-1]%M*num[i-1]%M+beta*num[i-1]%M+gamma%M;  
            num[i]%=M;  
            if(visit[num[i]]!=-1)
			{  
                loop=i-visit[num[i]]; //這樣loop正好爲循環個數  
                t=visit[num[i]];//表示循環列前面還有的個數  
                break;  
            }  
            else visit[num[i]]=i;  
          
        }  
        if(k<visit[num[i]]) 
		printf("%d\n",num[k]); //如果k未出現循環  
        else
		 printf("%d\n",num[(k-t)%loop+t]); //出現循環節,只需計算屬於循環的哪一個數      
    }  
    return 0;  
}  


發佈了87 篇原創文章 · 獲贊 179 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章