NOIP模拟测试 (随--数论 单--树上dp+数论 题--数论)

考试总结:

  这次考试走思有些严重,太困了。。。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 }
View Code

 

猜你喜欢

转载自www.cnblogs.com/OI-zzyy/p/11254557.html
今日推荐