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

一开始想求出递推式,结果求不出来。。。
不过由于式子是mod M(1<=M<=1000),所以xi不同的值最多只有1000个,不算x0,所以至多计算1000次。
定义一个数组存储Xi,另一个数组帮助判断Xi从哪个值开始循环。

WA on 39: ans[0]应该设为A%m, 由于flag[A%m]设为0,所以如果x1算出来是A%m,程序会认为已经和x0重复,而x0是A而不是A%m会出错。另外可以设为A%m的原因是,X1=f(x0)=f(x0%m)

#include <stdio.h>
#include 
<string.h>

int main(void) {
    
int A, a, b, c, m, k;
    scanf (
"%d%d%d%d%d%d"&A, &a, &b, &c, &m, &k);
    
int ans[1000= {A%m};
    
int flag[1001];
    memset(flag, 
-1sizeof(int)*1001);
    flag[A
%m]=0;
    
int i;
    
for (i = 1; flag[ans[i]=(a*ans[i-1]*ans[i-1]+b*ans[i-1]+c)%m]<0++i) {
        flag[ans[i]] 
= i;
    }
    
if (k==0) {
        printf (
"%d\n", A);
    } 
else if (k >= flag[ans[i]]) {
        printf (
"%d\n", ans[(k-flag[ans[i]])%(i-flag[ans[i]])+flag[ans[i]]]);
    } 
else {
        printf (
"%d\n", ans[k]);
    }
    
return 0;
}

posted on 2010-05-02 13:58 Willing 阅读(409) 评论(0)  编辑 收藏 引用 所属分类: ACM

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理