码迷,mamicode.com
首页 > 其他好文 > 详细

10.13 1.0考试 第三题 七十和十七 题解

时间:2017-10-13 14:08:26      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:efi   增加   print   bsp   ima   code   cst   题解   string   

技术分享

技术分享

技术分享

  这道题太尴尬了……

  当时打完第二题暴力一看还有两个多小时,开心的要死要死的,结果乐极生悲,在第二题调了太长时间,到这题就剩半个多小时了……

  看到输出C没反应过来,但是直觉告诉我和逆元有关,然后就发现答案就是a/b在模意义下的结果,然后也没时间想正解了,先打了个暴力上去,死调不出来。考完后才知道我们每将一个数提到开头,我们就要去重新扫一遍……SB出题人没说清楚啊!当时估摸也是太紧张了,忘了去试一下。

  正解是这样的:我们设f[i]为E的分子,那么转移如下:

    f[i]=f[i-1]+f[i-1]+2^0*jc[i-1]+f[i-1]+2^1*jc[i-1]+^+f[i-1]+2^i-1*jc[i-1].其中jc为阶乘。

  2^x就是我们把数x+1放在最后一位比f[i-1]增加的方案数。jc[i-1]就是刨去x后有多少排列方式。

技术分享
 1 #include <iostream>
 2 #include <cstdlib>
 3 #include <cstdio>
 4 #include <cstring>
 5 #include <queue>
 6 #include <algorithm>
 7 #include <cmath>
 8 #include <map>
 9 #define N 100005
10 using namespace std;
11 int n,p=1000000007;
12 long long exgcd(long long a,long long b,long long c)
13 {
14     if(!a)return -1;
15     if(c%a==0)return c/a;
16     long long t=exgcd(b%a,a,(((-c%a)+a)%a));
17     if(t==-1)return t;
18     return (t*b+c)/a;
19 }
20 long long jc[N],xp[N],f[N];
21 int main()
22 {
23     scanf("%d",&n);
24     xp[0]=1;
25     for(int i=1;i<=N-2;i++)xp[i]=(xp[i-1]*2)%p;
26     jc[0]=1;
27     for(int i=1;i<=N-2;i++)jc[i]=(jc[i-1]*i)%p;
28     f[1]=0;
29     for(int i=2;i<=n;i++)
30     {
31         f[i]=((i*f[i-1])%p+((xp[i-1]-1)*jc[i-1]%p))%p;
32     }
33     printf("%lld\n",f[n]*exgcd(jc[n],p,1)%p);
34     return 0;
35 }
View Code

 

10.13 1.0考试 第三题 七十和十七 题解

标签:efi   增加   print   bsp   ima   code   cst   题解   string   

原文地址:http://www.cnblogs.com/liutianrui/p/7660551.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!