不思議。
A:GCD求めてほげるだけ。落ちた。
#include<stdio.h> #include<algorithm> using namespace std; int b[100]; int gcd(int a,int b){ while(b){ a%=b; int c=a; a=b; b=c; }return a; } int main(){ int a; scanf("%d",&a); for(int i=0;i<a;i++)scanf("%d",b+i); int n=b[0]; int m=b[0]; //ここを本番では0にしたせいで落ちました。 for(int i=1;i<a;i++){ n=gcd(n,b[i]); m=max(b[i],m); } if((m/n+a)%2==1)printf("Alice\n"); else printf("Bob\n"); }
B:文字列の面倒なDP。Failure Linkをもっておいて経路復元する。落ちた。
C:
こちらをご覧ください。
こんな感じのコードを数種類生成していました。
#include<stdio.h> int main(){ printf("100000\n"); printf("99999999"); for(int i=0;i<99999;i++){ printf(" "); printf("%d",100000000+i); }printf("\n150000000 149900000\n"); }
本体はこれ。
#include<stdio.h> #include<algorithm> #include<queue> using namespace std; int b[100000]; int bfs[1000001]; int use[1000001]; int main(){ int a; scanf("%d",&a); for(int i=0;i<a;i++)scanf("%d",b+i); std::sort(b,b+a); int c,d; scanf("%d%d",&c,&d); int n=c-d+1; for(int i=0;i<n;i++)use[i]=i+1+d; for(int i=0;i<a;i++){ if(i&&b[i]==b[i-1])continue; int t=(d%b[i]==0)?d:(d+b[i]-d%b[i]); while(t<=c){ use[t-d]=max(use[t-d],t+b[i]-1); t+=b[i]; } } for(int i=1;i<n;i++){ use[i]=max(use[i],use[i-1]); // printf("%d: %d\n",i+d,use[i]); } int at=d; int ret=0; while(at<c){ at=use[at-d]; // printf("%d\n",at); ret++; } printf("%d\n",ret); }
D,E:知らぬ
0 + 0 + 1200 + 0 + 0 + (1000 - 150) = 2050 (53rd)
Rating: 1727 -> 1909 (+182)
ファッ!?