考试总结:
这次考试走思有些严重,太困了。。。T1 打了 30 min,啥也没打出来,QJ了一个测试点。T2打了 70 min 左右, 发现我只会打树上 dp,不会高斯消元,拿三十分走人。T3 有一点不敢做,但读了读题发现是一个裸的 $Cantalan$,调了半天没调出来,后来才发现 $ans$ 在更新时应是加法,而不是乘法。。。最后还是有 1/4 的点没想出来。总体来说,高斯、概率与期望还是坑!赶紧补。。。
自警!
T1:随
题干:
给出 n 个正整数 a1 , a2…an 和一个质数 mod 。一个变量 x 初始为 1 。进行 m 次操作,每次在 n 个数中随机选一个 ai,然后 $ x=x*ai%mod $。问 m 次操作之后 x 的取值的期望。答案一定可以表示成 a / b 的精确分数形式。a 和 b 可能很大,所以只需要输出 $a*inv(b)%mod$ 的结果.
第 1 个测试点 : mod = 2
第 2 个测试点 : n = 1
第 3 , 4 , 5 个测试点 : m <= 1000,1 <= mod <= 300。
第 6 , 7 , 8 个测试点: 1 <= mod <= 300
对于全部测试点: 1 <= ai < mod,mod 为质数 1 <= mod <= 1000,
对于全部测试点: 1 <= n <= 10^5,1 <= m <= 10^9
孙金宁教你学数学:
质数P的原根 g 满足 1 <= rt < P,且rt的 1 次方,2 次方…(P-1) 次方在模 P 意义下可以取遍 1 到 (P-1) 的所有整数。
欧拉定理: 对于质数P , 1 <= x < P 的任意 x 的 P-1 次方在模 P 意义下都为 1 。
显然,原根的 1 次方, 2 次方…(P-2)次方在模P意义下都不为 1,只有 (P-1) 次方在模P意义下为 1 。这也是一个数成为原根的充分必要条件。
题解:
Code:
T2:单
题干:
对于一棵树,认为每条边长度为 1 ,每个点有一个权值 a[i] 。
dis(u,v) 为点 u 到 v 的最短路径的边数,dis(u,u)=0。对每个点求出一个重要程度
点x的重要程度 b[x] 定义为其他点到这个点的距离乘上对应的点权再求和
即:$ b[x] = a[1]*dis(1,x) + a[2]*dis(2,x) + .... + a[n]*dis(n,x)$
现在有很多树和对应的 a 数组,并求出了 b 数组
不幸的是,记录变得模糊不清了;幸运的是,树的形态完好地保存了下来
a 数组和 b 数组至少有一个是完好无损的,但另一个数组完全看不清了
希望你求出受损的数组。多组数据。
第一行输入一个 T ,表示数据组数。接下来 T 组数据。
每组数据的第 1 行 1 个整数 n 表示树的点数.节点从 1 到 n 编号
接下来 n-1 行每行两个整数 u , v 表示 u 和 v 之间有一条边
接下来一行一个整数 t,表示接下来数组的类型。
t=0 则下一行是 a 数组, t=1 则下一行是 b 数组。
接下来一行 n 个整数,表示保存完好的那个数组,第i个数表示 a[i] 或 b[i] 。
题解:
Code:
T3:题
题干:
你在平面直角坐标系上,你一开始位于(0,0)。
每次可以在 上 / 下 / 左 / 右 四个方向中选一个走一步
即:从 (x,y) 走到 (x,y+1) , (x,y-1) , (x-1,y) , (x+1,y) 四个位置中的其中一个
允许你走的步数已经确定为 n .现在你想走 n 步之后回到 (0,0)
但这太简单了,你希望知道有多少种不同的方案能够使你在 n 步之后回到 (0,0) 。当且仅当两种方案至少有一步走的方向不同,这两种方案被认为是不同的。
答案可能很大所以只需要输出答案对 10^9+7 取模后的结果。( $10^9+7$ = 1000000007 ,1 和 7 之间有 8 个 0 )
这还是太简单了,所以你给能够到达的格点加上了一些限制。
一共有三种限制,加上没有限制的情况,一共有四种情况,用 0 , 1 , 2 , 3 标号:
0、没有任何限制,可以到达坐标系上所有的点,即能到达的点集为 { (x,y) | x,y 为整数 }
1、只允许到达 x 轴非负半轴上的点.即能到达的点集为 { (x,y) | x 为非负数,y = 0 }
2、只允许到达坐标轴上的点.即能到达的点集为 { (x,y) | x = 0 或 y = 0 }
3、只允许到达 x 轴非负半轴上的点, y 轴非负半轴上的点以及第 1 象限的点.即能到达的点集为 { (x,y) | x >= 0 , y >= 0}
题解:
这道题在考场上打的还是比较顺利的,但还是有 1/4 的点没有调出来。。。
讨论一下:
opt==0 :没有任何限制,式子:(先从 n 中选出 n/2 个向外走的与向内走的,再从各自的 n/2 中各选出)
opt==1 :
opt==2 :
opt==3 :
Code:
1 #include<cstdio> 2 #include<cstring> 3 #include<cstdlib> 4 #include<algorithm> 5 #define $ 100010 6 #define int long long 7 #define mod 1000000007 8 using namespace std; 9 int m,n,k,t,ans,f[$],opt,fac[$*2],inv[$*2],g[$],cnt; 10 inline int qpow(int a,int x,int sum=1){ 11 for(;x;x>>=1,a=a*a%mod) if(x&1) sum=sum*a%mod; 12 return sum; 13 } 14 inline int C(int x,int y){ 15 return fac[y]*inv[x]%mod*inv[y-x]%mod; 16 } 17 inline void work0(){ 18 ans=0; 19 for(register int i=0;i<=n/2;++i) 20 ans=(ans+C(i,n/2)%mod*C(i,n/2)%mod*C(n/2,n)%mod)%mod; 21 printf("%lld\n",ans); 22 } 23 inline void work1(){ 24 n/=2; ans=1; 25 for(register int i=n+2;i<=n*2;++i) ans=ans*i%mod; 26 for(register int i=2;i<=n;++i) ans=ans*qpow(i,mod-2)%mod; 27 printf("%lld\n",ans); 28 } 29 inline void work2(){ 30 f[0]=1; 31 for(register int i=2;i<=n;i+=2) 32 for(register int j=0;j<i;j+=2) 33 f[i]=(f[i]+f[j]*C((i-j)/2,i-j)%mod)%mod; 34 printf("%lld\n",f[n]*2%mod); 35 } 36 inline void work3(){ 37 ans=0; 38 for(register int i=0;i<=n;i+=2) 39 ans=(ans+C(i,n)%mod*C(i/2,i)%mod*qpow(i/2+1,mod-2)%mod* 40 C((n-i)/2,n-i)%mod*qpow((n-i)/2+1,mod-2)%mod)%mod; 41 printf("%lld\n",ans); 42 } 43 signed main(){ 44 scanf("%lld%lld",&n,&opt); 45 fac[0]=fac[1]=inv[1]=inv[0]=1; 46 for(register int i=2;i<=n*2;++i) fac[i]=fac[i-1]*i%mod; 47 for(register int i=2;i<=n*2;++i) inv[i]=qpow(fac[i],mod-2); 48 if(opt==0) work0(); 49 if(opt==1) work1(); 50 if(opt==2) work2(); 51 if(opt==3) work3(); 52 }