发布时间:2025-12-09 12:01:08 浏览次数:2
题目
模拟。
#include <iostream>using namespace std;int main(){ string k,c; cin>>k>>c; for (int i=0;i<c.length();i++) { int t=(k[i%k.length()]&31)-1; c[i]=(c[i]&31)-t>0?c[i]-t:c[i]-t+26; } cout<<c<<endl; return 0;}题目
按\(a_ib_i\)升序排序,证明采用邻项交换法即可。
垃圾出题人要我写高精。
#include<bits/stdc++.h>using namespace std;struct BIGNUM{ int a[100001]; BIGNUM() { memset(a,0,100001),a[0]=1; } BIGNUM operator=(string s) { a[0]=s.length(); for(int i=1;i<=a[0];i++) a[i]=s[a[0]-i]-'0'; return *this; } BIGNUM operator=(int n) { char x[100001]; string s; sprintf(x,"%d",n); s=x; *this=s; return *this; } BIGNUM (int n) { *this=n; } BIGNUM (string s) { *this=s; } BIGNUM operator*(BIGNUM b) { BIGNUM c; for(int i=1;i<=a[0];i++) for(int j=1;j<=b.a[0];j++) c.a[i+j-1]+=a[i]*b.a[j],c.a[i+j]+=c.a[i+j-1]/10,c.a[i+j-1]%=10; c.a[0]=a[0]+b.a[0]-1; if(c.a[c.a[0]+1]) c.a[0]++; return c; } BIGNUM operator/(int x) { BIGNUM b; b.a[0]=a[0]; int tmp=0; for (int i=a[0];i;i--) { tmp=tmp*10+a[i]; b.a[i]=tmp/x; tmp%=x; } while(!b.a[b.a[0]]&&b.a[0]>1) b.a[0]--; return b; } bool operator<(BIGNUM b) { if(a[0]!=b.a[0]) return a[0]<b.a[0]; for(int i=a[0];i;i--) if(a[i]!=b.a[i]) return a[i]<b.a[i]; return false; }};ostream& operator <<(ostream &out,BIGNUM &x){ for(int i=x.a[0];i;i--) cout<<x.a[i]; return out;}struct Lovelive{ int x,y; long long z;}a[100001];bool cmp(Lovelive a,Lovelive b){ return a.z<b.z;}int n;int main(){ scanf("%d",&n); for(int i=0;i<=n;i++) scanf("%d%d",&a[i].x,&a[i].y),a[i].z=a[i].x*a[i].y; sort(a+1,a+n+1,cmp); BIGNUM ans=1,tmp,k=1; for(int i=1;i<=n;i++) { k=k*a[i-1].x; tmp=k/a[i].y; ans=ans<tmp? tmp:ans; } cout<<ans; return 0;}题目
exgcd。
注意exgcd求的是绝对值最小的解。
#include<bits/stdc++.h>using namespace std;int a,b,x,y,k;void exgcd(int a,int b){!b? (x=1,y=0):(exgcd(b,a%b),k=x,x=y,y=k-a/b*y);}int main(){cin>>a>>b,exgcd(a,b),cout<<(x+b)%b;}