【A Ant】
比赛的时候公式推出来了,可是取模那一块弄错了,一直wa
假设另外两条边是x,y
那么最短的路线就是len = x^2 + y^2 + n^2 + 2*x*y
这个公式分成三个部分求
s1 = sum(x^2 + y^2)
s2 = sum(n^2)
s3 = sum(2*x*y)
假设n=3
n x y
3 3 3
3 3 2
3 3 1
3 2 2
3 2 1
3 1 1
显然s2 = (n^2) * n *(n+1)/ 2
s1的公式也是简单的
对于每一个i (1 <= i <= n), i^2都有(n+1)个
s1 = (n + 1)* ( n*(n+1)*(n+2)/6 )
难点是s3,需要通过规律得到
s3 = ( n * (n+1)/2 )^ 2+ n*(n+1)*(n+2)/6
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
using namespace std;
#define mod 1000000007
#define ll long long int
ll mul(ll a,ll n)
{
ll s=1;
while(n)
{
if(n&1) s=(s*a)%mod;
a=(a*a)%mod;
n>>=1;
}
return s;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
ll n;
scanf("%lld",&n);
n%=mod;
ll s1,s2,s3;
s1=(n+2)%mod*n%mod*(n+1)%mod*(2*n%mod+1)%mod*mul(6,mod-2)%mod;
s2=n%mod*n%mod*n%mod*(n+1)%mod*mul(2,mod-2)%mod;
s3=n%mod*n%mod*(n+1)%mod*(n+1)%mod*mul(4,mod-2)%mod;
ll ans=(s1+s2+s3)%mod;
// cout<<s1<<" "<<s2<<" "<<s3<<endl;
printf("%lld\n",ans);
}
return 0;
}
【C Cake】
最大的p[ i ].b都是Bob拿走的
先按p[ i ].b从大到小排序
dp的转移方程式是
dp[ i ][ j ] = max ( dp[ i-1 ][ j ] , dp[ i-1 ][ j-1 ] + p[ i ].a)
i:前i个 j:Alice取了j个
j <= i/2
<span style="font-size:14px;">#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
int dp[805][805];
struct node
{
int a,b;
friend bool operator < (const node n1,const node n2)
{
return n1.b>n2.b;
}
}p[805];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&p[i].a,&p[i].b);
}
memset(dp,0,sizeof(dp));
sort(p+1,p+1+n);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i/2;j++)
{
dp[i][j]=max(dp[i-1][j],dp[i-1][j-1]+p[i].a);
}
}
printf("%d\n",dp[n][n/2]);
}
return 0;
} </span>
【H Market】
【J Coins】
【L Semantic Version】