NOIP2012 T1*2
D1T1 Vigenère 密码(一次ac)
用时 20min 复杂度 n
一道字符串模拟,给出密钥用一套简单的密码对应表把密码还原,只需要注意字母的范围。
因为不太熟悉字符的ASCII码搞的时间有点长,ASCII码的优点是可以把字母大小关系转化成数字进行处理,而且不必考虑字母的大小写。
呆马:
#include<cstdio> #include<algorithm> #include<cstring> #include<iostream> using namespace std; int main() { string a,b; cin>>a>>b; for(int i=0;i<b.length();i++) { int k=(a[i%a.length()]&31)-1; if((b[i]&31)-k>0) b[i]=b[i]-k; else b[i]=b[i]-k+26; } cout<<b; return 0; }
D2T2 同余方程(一次ac)
用时:5min 复杂度 logn
拓展gcd的板子,要注意的是最后x要重新%一遍保证为正
呆马:
#include<cstdio>
#define ll long long
using namespace std;
ll exgcd(ll a,ll b,ll &x,ll &y)
{
if(b==0)
{
x=1;
y=0;
return a;
}
ll k=exgcd(b,a%b,x,y);
ll t=x;
x=y;
y=t-(a/b)*y;
return k;
}
int main()
{
ll a,b;
scanf("%lld%lld",&a,&b);
ll x,y;
ll k=exgcd(a,b,x,y);
printf("%lld",(x+b)%b);
return 0;
}