[AGC022F]Checkers

Description

x = 1 0 100 x=10^{100} x=10100,数轴上有n个点,第i个点的坐标为 x i x^i xi
进行n-1次操作,第i次操作选择两个点A和B,将A变为A关于B的对称点,然后删去B
最后会剩下1一个数,问这个数有多少种可能的取值
n<=50

Solution

由于x很大,我们可以只考虑每个数的贡献
容易知道每个数的贡献形式为±2^k
如果我们选择A和B,就从B向A连一条边,最后我们会得到一棵有根树,第i个点的权值为2^深度
现在考虑正负号,首先一个点的每个儿子都会将其取反一次
然后每个点的所有祖先在这个点之后选择的其他儿子也会将这个点取反一次
我们直接考虑某个点是否等于父亲,那么只需要考虑父亲的其他儿子的贡献和自己的儿子数
若一个点有k个儿子,那么会有 ⌊ k 2 ⌋ \lfloor{k\over 2}\rfloor 2k个点和其状态不同
考虑一层一层转移,我们需要知道上一层有j个点有奇数个儿子
枚举这一层有k个点,不考虑这一层点的儿子的影响,我们会有(k-j)/2个点和父亲不同
枚举实际有x个点和父亲不同,我们需要令 ∣ ( k − j ) 2 − x ∣ |{(k-j)\over 2}-x| 2(kj)x个点有奇数个儿子
直接转移即可,复杂度是O(n^4)的

Code

#include <cstdio>
#include <cstring>
#include <algorithm>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
using namespace std;

typedef long long ll;

const int N=55,Mo=1e9+7;

int n,C[N][N],f[N][N];

void inc(int &x,int y) {x=x+y>=Mo?x+y-Mo:x+y;}

int main() {
	scanf("%d",&n);
	fo(i,0,n) {
		C[i][0]=1;
		fo(j,1,i) C[i][j]=(C[i-1][j]+C[i-1][j-1])%Mo;
	}
	f[1][0]=f[1][1]=n;
	fo(i,1,n-1)
		fo(j,0,i)
			fo(k,max(j,1),n-i) {
				if ((k-j)&1) continue;
				int y=(k-j)/2;// 当前和父亲不一样
				fo(x,0,k) {
					// 目标和父亲不一样
					inc(f[i+k][abs(y-x)],(ll)f[i][j]*C[n-i][k]%Mo*C[k][x]%Mo);
				}
			}
	printf("%d\n",f[n][0]);
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用Twisted传输文件的一种常见方法是使用Twisted的文件传输协议(FTP)。以下是一个简单的例子: ```python from twisted.protocols.ftp import FTPFactory, FTPRealm from twisted.cred.portal import Portal from twisted.cred.checkers import AllowAnonymousAccess, FilePasswordDB from twisted.internet import reactor # 设置FTP服务器的根目录 ftp_realm = FTPRealm('/path/to/ftp/root') # 设置FTP用户验证方式 ftp_portal = Portal(ftp_realm, [AllowAnonymousAccess(), FilePasswordDB("ftp_users.txt")]) # 设置FTP服务器工厂 ftp_factory = FTPFactory(ftp_portal) # 启动FTP服务器 reactor.listenTCP(21, ftp_factory) reactor.run() ``` 在上面的例子中,我们设置了FTP服务器的根目录为`/path/to/ftp/root`,并设置了FTP用户验证方式为允许匿名访问和使用文件密码数据库。 启动FTP服务器后,我们可以使用FTP客户端来连接并上传或下载文件。例如,使用Python内置的`ftplib`库: ```python import ftplib # 连接FTP服务器 ftp = ftplib.FTP() ftp.connect('localhost', 21) ftp.login() # 上传文件 with open('local_file.txt', 'rb') as f: ftp.storbinary('STOR remote_file.txt', f) # 下载文件 with open('local_file.txt', 'wb') as f: ftp.retrbinary('RETR remote_file.txt', f.write) # 关闭FTP连接 ftp.quit() ``` 在上面的例子中,我们连接到本地的FTP服务器(IP地址为`localhost`,端口为`21`),并使用用户名和密码进行认证。然后,我们使用`storbinary`方法上传本地文件`local_file.txt`到FTP服务器上的`remote_file.txt`文件,使用`retrbinary`方法从FTP服务器下载`remote_file.txt`文件并保存为本地文件`local_file.txt`。最后,我们关闭FTP连接。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值