1.个人反思
”闲来无事”,摆烂中发现6天后篮球杯开始了,随便写点以表安慰
(悲
A:卡片
B:直线
这种题不要试图找规律(因为我找了一会发现不如暴力)
数据范围很小,set去重就OK了
void solve()
{
for(int xi=0;xi<20;xi++){
for(int yi=0;yi<21;yi++){
for(int xj=0;xj<20;xj++){
for(int yj=0;yj<21;yj++){
if(xi==xj && yi==yj) continue;
int a=xi-xj,b=yj-yi,c=-xi*yj+xj*yi;
int g=gcd(gcd(a,b),c);
a/=g;b/=g;c/=g;
s.insert(point(a,b,c));
}
}
}
}
printf("%d",s.size());
}
C:货物摆放
一眼质数分解
我想了一个完整的解法,就是分解出来的式子是
∏
i
=
0
j
p
i
a
i
\prod_{i=0}^{j} p_i^{a_i}
∏i=0jpiai
然后考虑前两个,取x个,就是有
C
a
i
x
C_{a^i}^{x}
Caix种,剩下来的就是第三个人的,然后两个人分x个,有
∑
x
i
=
0
C
i
x
\sum_{x}^{i=0} C_{i}^{x}
∑xi=0Cix 种取法即
2
x
2^x
2x个,然后依次分下来,再相乘即使结果:
∑
j
i
=
0
C
a
i
x
∗
2
x
\sum_{j}^{i=0}C_{a^i}^{x} *2^x
∑ji=0Caix∗2x
(不确定对不对
但是写了一半突发奇想打印一下固定数的分解结果,好家伙,全是1或3就几个数,手算更快好吧
分解出来的结果是这个
3
5
∗
10
3^5 * 10
35∗10
D: 路径
最短路+LCM,很简单的
n
2
n^2
n2也就1e6
E: 回路计数
这题都忘光了,路径状压dp
ll f[1<<21][21];
void solve()
{
ms(f,0);
f[1][0]=1;
for(int i=1;i< 1<<21;i++){
for(int j=0;j<21;j++){
if( (i>>j)&1){
for(int k=0;k<21;k++){
if(((i>>k)&1) && __gcd(j+1,k+1)==1 ){
f[i][j]+=f[i^(1<<j)][k];
}
}
}
}
}
ll ans=0;
for(int i=0;i<21;i++) ans+=f[(1<<21)-1][i];
printf("%lld",ans);
}
F: 砝码称重
太典啦,背包dp,可以看做01dp,也能看成多重背包
dp[i][j] 第i个放不放,j是当前重量
注意一下 j+w[i]能超过1e5,记得数组开大点
其实也能多重背包,从sum反向枚举,算是否减掉
scanf("%d",&n);
ll sum=0;
for(int i=1;i<=n;i++){
scanf("%d",&w[i]);
sum+=w[i];
}
ms(dp,0);
for(int i=0;i<n;i++) dp[i][0]=true;
int ans=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=sum;j++){
if( (dp[i-1][j] || dp[i-1][abs(j-w[i])] || dp[i-1][j+w[i]] ) && !dp[i][j] ){
dp[i][j]=true;
//ans++;
}
}
}
for(int i=1;i<=sum;i++){
if(dp[n][i]) ans++;
}
printf("%d",ans);