今天写写cf上以前的水题,找找自信
A. Olesya and Rodion
此题要求一个能被t整除的n位数,直接t为开始,后面全部为0. 当然,需要排除位数为1但t=10的情况。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int main() { int n,t,i; scanf("%d%d",&n,&t); if (n==1 && t==10) printf("-1\n"); else { if (t==10) t=1; printf("%d",t); for (int i=0;i<n-1;i++) printf("0"); printf("\n"); } return 0; }
B. Kolya and Tanya
给你一个环,环上有3n个点,每个点的权值可以是1-3,然后问你满足a[i]+a[i+1]+a[i+2]!=6的方案有多少种,具体做法是先求出反例的情况,即a[i]+a[i+1]+a[i+2]=6的情况,这三个数的取值一共有7种,那么答案就是 3^(3n) - 7^n
#include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<cmath> using namespace std; #define MOD 1000000007 int n; LL pw(int a,int x) { LL k=1; for (int i=1;i<=x;i++) k=(k*a)%MOD; return k%MOD; } int main() { scanf("%d",&n); printf("%I64d\n",(pw(27,n)-pw(7,n)+MOD)%MOD); return 0; }
C. Marina and Vasya
要求与两个字符串的不同字符都为t的第三个字符串。
#include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<cmath> using namespace std; typedef long long LL; #define N 100010 int n,t; int ans; char a[N],b[N],c[N]; int main() { scanf("%d%d",&n,&t); scanf("%s%s",a+1,b+1); t=n-t; for (int i=1;i<=n;i++) if (a[i]==b[i]) ans++; if (ans+(n-ans)/2<t) { printf("-1\n"); return 0; } int k=min(t,ans); for (int i=1,j=1;i<=n && j<=k;i++) if (a[i]==b[i]) c[i]=a[i],j++; for (int i=1,j=1;i<=n && j<=t-k;i++) if (a[i]!=b[i] && !c[i]) c[i]=a[i],j++; for (int i=1,j=1;i<=n && j<=t-k;i++) if (a[i]!=b[i] && !c[i]) c[i]=b[i],j++; for (int i=1;i<=n;i++) if (!c[i]) for (int j=‘a‘;j<=‘z‘;j++) if (a[i]!=j && b[i]!=j) { c[i]=j; break; } printf("%s\n",c+1); return 0; }
D. Dima and Lisa
把一个数插成1或2或3个素数
#include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<cmath> using namespace std; typedef long long LL; #define N 100010 int n; bool check(int x) { for (int i=2;i<=sqrt(x);i++) if (x%i==0) return false; return true; } int main() { scanf("%d",&n); if (check(n)) { printf("1\n%d",n); return 0; } for (int i=n;i;i-=2) if (check(i)) { int k=n-i; if (check(k)) { printf("2\n%d %d\n",i,k); return 0; } for (int j=k-2;j;j--) if (check(j) && check(k-j)) { printf("3\n%d %d %d\n",i,j,k-j); return 0; } } return 0; }
E. Anton and Ira
给两个数组,要求让第一个数组变成第二个数组,可以进行交换操作
每次交换操作的代价是abs(i-j)
然后让你把方案输出出来
#include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<cmath> using namespace std; typedef long long LL; #define N 2010 #define M 2000010 int a[N],b[N],c[N]; int l[M],r[M]; int n; int ans,cnt; int main() { scanf("%d",&n); for (int i=1;i<=n;i++) scanf("%d",&a[i]); for (int i=1;i<=n;i++) scanf("%d",&b[i]),c[b[i]]=i; for (int i=1;i<=n;i++) { if (a[i]!=b[i]) { int k=-1; for (int j=i+1;j<=n;j++) if (a[j]==b[i]) { k=j; break; } while (k!=i) for (int j=i;j<k;j++) if (c[a[j]]>=k) { ans+=abs(k-j); swap(k,j); swap(a[k],a[j]); l[++cnt]=k; r[cnt]=j; break; } } } printf("%d\n%d\n",ans,cnt); for (int i=1;i<=cnt;i++) printf("%d %d\n",l[i],r[i]); return 0; }
时间: 2024-10-10 17:54:39