数据加密(Encrypt)

来源:百度知道 编辑:UC知道 时间:2024/06/18 15:18:33
Problem A : Encrypt

问题描述

Rivest是密码学专家。近日他正在研究一种数列E={E[1],E[2],……,E[n]},
且E[1]=E[2]=p(p为一个质数),E[i]=E[i-2]*E[i-1] (若2例如{2,2,4,8,32,256,8192,……}就是p=2的数列。在此基础上他又设计了一种加密
算法,该算法可以通过一个密钥q (q算公式为:d=E[n] mod q。现在Rivest想对一组数据进行加密,但他对程序设计不太
感兴趣,请你帮助他设计一个数据加密程序。

输入格式

从文件a.in第一行读入m,p。其中m表示数据个数,p用来生成数列E。
以下有m行,每行有2个整数n,q。n为待加密数据,q为密钥。
规模:0
输出格式

将加密后的数据按顺序输出到文件a.out。
第i行输出第i个加密后的数据。

输入样例1
2 7
4 5
4 6

输出样例1
3
1

输入样例2
4 7
2 4
7 1
6 5
9 3

输出样例2
3
0
1
1

编成c的

#include<stdio.h>
…………

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 100000
typedef long long qword;
qword m,q,n,mod;
typedef qword mat[2][2];
mat a,b,c;
qword pow_mod(qword x,qword y,qword mod)
{
qword ret=1;
while (y)
{
if (y&1)ret=ret*x%mod;
x=x*x%mod;
y>>=1;
}
return ret;
}
int prime[MAXN],topp=-1;
bool pflag[MAXN];
void init()
{
for (int i=2;i<MAXN;i++)
{
if (!pflag[i])
prime[++topp]=i;
for (int j=0;j<=topp && i*prime[j]<MAXN;j++)
{
pflag[i*prime[j]]=true;
if (i%prime[j]==0)break;
}
}
}