======牛客多校第七场====== =====B===== GCD的递归。比较难的C语言练习。 #include long long int t, tmp, ans[20005], top = 1; long long gcd(long long a,long long b) { return b ? gcd(b, a % b) : a; } void solve(long long int n, long long int m, long long int res) { if(n > m) { tmp = m; m = n; n = tmp; } if(res == 0) { return; } long long int k = m - m % n; while(k--) { ans[top++] = n; } solve(n, m % n, n * (m % n)); return; } int main() { scanf("%d",&t); while(t--) { long long n, m; top = 1; scanf("%lld%lld", &n, &m); solve(n, m, n * m); long long l = n + m - gcd(n, m); printf("%lld\n", l); int i; for(i=1;i<=l;i++) { printf("%lld ",ans[i]); } printf("\n"); } } =====D===== 水。 #include #include int main() { int k; scanf("%d",&k); while(k--) { int n; scanf("%d",&n); if(n==1||n==24) { printf("Fake news!\n"); } else { printf("Nobody knows it better than me!\n"); } } return 0; } =====H===== 数论分块。注意先加上模再取模。 #include long long int n, k, r, l, cnt, cnt1; int main() { scanf("%lld%lld", &n, &k); if(k > n) { cnt1 = (cnt1 + k - n + 1000000007) % 1000000007; } k=n =====A===== 以下是补题。 这个题数据量较小,甚至可以打表。 #include #include #include int f[9][2*250][2*250], n, r; int Ans[20][50]; int main() { int T; scanf("%d",&T); memset(Ans,255,sizeof(Ans)); while (T--) { scanf("%d%d", &n, &r); if (Ans[n][r]!=-1) { printf("%d\n",Ans[n][r]); continue; } int i; for(i=0; i<=n; ++i) { int j; for(j=250-n*r; j<=250+n*r; ++j) { int k; for(k=250-n*r; k<=250+n*r; ++k) { f[i][j][k]=-1; } } } f[0][250][250]=0; for(i=-r; i<=r; ++i) { int j; for(j=-r; j<=r; ++j) { if(i*i+j*j<=r*r) { f[1][250+i][250+j] = 0; } } } for(i=2; i<=n; ++i) { int j; for(j=-r; j<=r; ++j) { int k = trunc(sqrt(r*r-j*j)); int s1; for(s1=250-(i-1)*r; s1<=250+(i-1)*r; ++s1) { int s2; for(s2=250-(i-1)*r; s2<=250+(i-1)*r; ++s2) { int z = f[i-1][s1][s2]; int t1 = s1 - 250; int t2 = s2 - 250; if (z==-1) continue; f[i][s1+j][s2+k] =f[i][s1+j][s2+k]>(z+(t1*t1+t2*t2+z)/(i-1)-2*(j*t1+k*t2)+(i-1)*(j*j+k*k))?f[i][s1+j][s2+k]:(z+(t1*t1+t2*t2+z)/(i-1)-2*(j*t1+k*t2)+(i-1)*(j*j+k*k)); f[i][s1+j][s2-k] =f[i][s1+j][s2-k]>(z+(t1*t1+t2*t2+z)/(i-1)-2*(j*t1-k*t2)+(i-1)*(j*j+k*k))?f[i][s1+j][s2-k]:(z+(t1*t1+t2*t2+z)/(i-1)-2*(j*t1-k*t2)+(i-1)*(j*j+k*k)); } } } } int ans = 0; for(i=250-n*r; i<=250+n*r; ++i) { int j; for(j=250-n*r; j<=250+n*r; ++j) { ans =ans>f[n][i][j]?ans:f[n][i][j]; } } printf("%d\n", ans); Ans[n][r]=ans; } return 0; } =====I===== #include int T; long long mod; long long norings[5007], GraphCnt[5007], EdgeCnt[5007], f[5007], g[5007]; long long SS[5007][5007]; int power(int x, int times) { return SS[x][times]; } long long C[5007][5007]; int main() { scanf("%d%d", &T, &mod); int i; for(i = 1; i < 5007; i++) { SS[i][0] = 1; int j; for(j = 1; j < 5007; j++) SS[i][j] = (long long)SS[i][j - 1] * i % mod; } for(i = 0; i < 5007; i++) { C[i][0] = C[i][i] = 1; int j; for(j = 1; j < i; j++) { C[i][j] = C[i - 1][j - 1] + C[i - 1][j] ; if (C[i][j] >= mod) C[i][j]-=mod; } } norings[1] = norings[2] = 1; for(i = 3; i < 5007; i++) { norings[i] = power(i, i - 2); } for(i = 1; i < 5007; i++) { GraphCnt[i] = norings[i]; } for(i = 2; i < 5007; i++) { EdgeCnt[i] = 0; int j; for(j = 1; j <= i - 1; j++) { EdgeCnt[i] = (EdgeCnt[i] + C[i - 2][j - 1] * power(i - 1, i - j - 1) % mod * i % mod * (j * j) % mod) % mod; } } f[0] = 1; for(i = 1; i < 5007; i++) { int j; for(j = 1; j <= i; j++) { f[i] = (f[i] + GraphCnt[j] * f[i - j] % mod * C[i - 1][j - 1]) % mod; g[i] = (g[i] + C[i - 1][j - 1] * (EdgeCnt[j] * f[i - j] % mod + GraphCnt[j] * g[i - j] % mod)) % mod; } } while (T--) { int n; scanf("%d",&n); printf("%lld\n",g[n]); } return 0; } =====J===== 见[[小型代码分析系统的实现方式]]。