这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 | ||
2020-2021:teams:namespace:牛客多校第七场 [2020/08/06 11:30] great_designer |
2020-2021:teams:namespace:牛客多校第七场 [2020/08/08 11:26] (当前版本) great_designer |
||
---|---|---|---|
行 94: | 行 94: | ||
</hidden> | </hidden> | ||
+ | =====H===== | ||
+ | |||
+ | 数论分块。注意先加上模再取模。 | ||
+ | |||
+ | <hidden> | ||
+ | <code C> | ||
+ | |||
+ | #include<stdio.h> | ||
+ | |||
+ | 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<k?n:k; | ||
+ | for(l = 1ll; l <= k; l = r + 1ll) | ||
+ | { | ||
+ | if(n / l) | ||
+ | { | ||
+ | r = n/(n/l); | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | r = k; | ||
+ | } | ||
+ | r=r<k?r:k; | ||
+ | cnt = (cnt + (r - l + 1ll) * (n / l) + 1000000007) % 1000000007; | ||
+ | if(n % r == 0ll) | ||
+ | { | ||
+ | cnt1 = (cnt1 + r - l + 1000000007) % 1000000007; | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | cnt1 = (cnt1 + r - l + 1ll + 1000000007) % 1000000007; | ||
+ | } | ||
+ | } | ||
+ | cnt = (2ll * cnt - n + 1000000007) % 1000000007; | ||
+ | printf("%lld\n", (cnt + cnt1 + 1000000007) % 1000000007); | ||
+ | } | ||
+ | |||
+ | </code> | ||
+ | </hidden> | ||
+ | |||
+ | =====A===== | ||
+ | |||
+ | 以下是补题。 | ||
+ | |||
+ | 这个题数据量较小,甚至可以打表。 | ||
+ | |||
+ | <hidden> | ||
+ | <code C> | ||
+ | |||
+ | #include<stdio.h> | ||
+ | #include<string.h> | ||
+ | #include<math.h> | ||
+ | |||
+ | 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; | ||
+ | } | ||
+ | |||
+ | </code> | ||
+ | </hidden> | ||
+ | |||
+ | =====I===== | ||
+ | |||
+ | <hidden> | ||
+ | <code C> | ||
+ | |||
+ | #include<stdio.h> | ||
+ | |||
+ | 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; | ||
+ | } | ||
+ | |||
+ | </code> | ||
+ | </hidden> | ||
+ | |||
+ | =====J===== | ||
+ | |||
+ | 见[[小型代码分析系统的实现方式]]。 | ||