字符加密 cipher

Posted forward777

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字符加密 cipher相关的知识,希望对你有一定的参考价值。

  评测传送门

Description:

  Valentino 函数的定义:
  对于一个由数字和小写字母组成的字符串 S,两个整数 K,M,将 S 视为一个 P 进制数,定义:
  Valentino(S, K, M) = KS mod M
  对于一个字串对应的进制 P,现作出如下规定:
  S = “12445”,你应该将它视为一个 6 进制数:124456 = 190110 。
  S = “c0ab5h”,你应该将它视为一个 18 进制数:c0ab5h18 = 2273680710 。
  即,对于一个由数字和小写字母组成的字符串 S,将’a’视为 10,’b’视为 11,...,’z’视为 35,你应该找到最小的 P,使得 S 是一个合法的 P 进制数。
  现在,Valentino 手上有若干个由数字和小写字母组成的字符串。他选定了两个数 K,M,想求出每个字符串的 Valentino 函数的十进制表示。但是由于字符串实在太长了,Valentino 实在算不过来,所以他只好求助于你。

Input
  第 1 行为两个正整数 K, M。
  接下来每行一个由数字和小写字母组成的字符串,代表你要处理的字符串。

Output
  每行一个整数,第 i 行输出第 i 个字符串的 Valentino 函数值,以十进制表示。

 

正解:

技术图片

 

我觉得solution讲得超级清楚啊(图点开看还是挺清楚的)

但是要补充解释一个地方:x的含义是 kpi,pi是p的i次方

 

CODE:

技术图片
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<string>
 4 #include<cstring>
 5 #define R register
 6 #define go(i,a,b) for(R int i=a;i<=b;i++)
 7 #define yes(i,a,b) for(R int i=a;i>=b;i--)
 8 #define M 100000+1
 9 #define ll long long
10 using namespace std;
11 ll k,m,n,x,len,a[M],as;
12 string s;
13 ll ksm(ll x,ll y)
14 {
15     ll ans=1;
16     while(y)
17     {
18         if(y&1) ans=ans*x%m;
19         x=x*x%m;y>>=1;
20     }
21     return ans%m;
22 }    
23 int main()
24 {
25     scanf("%lld%lld",&k,&m);
26     while(cin>>s)
27     {
28         len=s.length()-1;n=0;as=1;x=k;
29         go(i,0,len)
30         {
31             if(s[i]>=0&&s[i]<=9) a[i]=s[i]-0;
32             else a[i]=s[i]-a+10;
33             n=max(n,a[i]);
34         }n+=1;
35         yes(i,len,0)
36         {
37             as=as*ksm(x,a[i])%m;
38             x=ksm(x,n);
39         }
40         printf("%lld
",as);
41     }
42     return 0;
43 }
View Code

 












以上是关于字符加密 cipher的主要内容,如果未能解决你的问题,请参考以下文章

_bzoj1031 [JSOI2007]字符加密Cipher后缀数组

[BZOJ1031][JSOI2007]字符加密Cipher(后缀数组)

如何使用 OpenSSL::Cipher 加密 UTF-8 字符串中的数据?

BZOJ 1031: [JSOI2007]字符加密Cipher

Java Cipher 解密中的奇怪字符

[JSOI2007]字符加密Cipher