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

2017 icpc 西安网络赛

时间:2017-09-17 00:25:05      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:ret   turn   最大流最小割   数位   分布   quick   name   long   while   

F. Trig Function

技术分享

样例输入

2 0
2 1
2 2

样例输出

998244352
0
2

找啊找啊找数列和论文。cosnx可以用切比雪夫多项式弄成(cosx)的多项式,然后去找到了相关的公式:
技术分享

 技术分享

技术分享

 然后写个快速幂预处理啥的,很快就解决了~

技术分享
 1 #include<bits/stdc++.h>
 2 #define clr(x) memset(x,0,sizeof(x))
 3 #define clr_1(x) memset(x,-1,sizeof(x))
 4 #define LL long long
 5 #define mod 998244353
 6 using namespace std;
 7 LL jc[10010],djc[10010];
 8 LL n,m,k,ans;
 9 LL quick_pow(LL x,LL n)
10 {
11     LL res=1;
12     x=(x%mod+mod)%mod;
13     while(n)
14     {
15         if(n&1)
16             res=res*x%mod;
17         x=x*x%mod;
18         n>>=1;
19     }
20     return res;
21 }
22 
23 void init()
24 {
25     jc[1]=jc[0]=1;
26     for(int i=2;i<=10000;i++)
27         jc[i]=(jc[i-1]*i)%mod;
28     djc[10000]=quick_pow(jc[10000],mod-2);
29     for(int i=9999;i>=1;i--)
30         djc[i]=djc[i+1]*(i+1)%mod;
31     djc[0]=1;
32     return ;
33 }
34 int main()
35 {
36     init();
37     while(scanf("%lld%lld",&n,&m)!=EOF)
38     {
39         if(m>n || m<0 || (n-m)%2!=0)
40         {
41             printf("0\n");
42             continue;
43         }
44         ans=(n-m)/2%2==1?-1:1;
45         ans=(ans*djc[m]*n%mod+mod)%mod;
46         if(n-m<=n+m-2)
47             for(LL i=n-m+2;i<=n+m-2;i+=2)
48                 ans=ans*(i%mod)%mod;
49         else
50             for(LL i=n-m;i>n+m-2;i-=2)
51                 ans=ans*quick_pow(i,mod-2)%mod;
52         printf("%lld\n",ans);
53     }
54     return 0;
55 }
View Code

E。 Maximum Flow

技术分享

 

 

样例输入

2

样例输出

1

这题可以用最大流最小割推推,但我~找规律的2333。

首先是2^k的n(默认n--了),那么所有的从0出来的流都能到达终点,也就是流量为(n+1)*n/2。然后写个最大流打个表,然后将i和i-1作差。可以发现在2^k~2^(k+1)的数中,差为2(2^0+1)每隔2个出现,差为5(2^2+1)每隔4个出现,17(2^4+1)每隔8个出现。。。依此类推。然后你懂得~。

技术分享
 1 #include<bits/stdc++.h>
 2 #define clr(x) memset(x,0,sizeof(x))
 3 #define LL long long
 4 #define mod 1000000007
 5 using namespace std;
 6 LL quick_pow(LL x, LL n) {
 7     LL res = 1;
 8     x=(x%mod+mod)%mod;
 9     while(n) {
10         if(n&1)
11             res=res*x% mod;
12         n >>=1;
13         x =x*x% mod;
14     }
15     return res;
16 }
17 int main()
18 {
19     LL n,m,q,l,ans,k,kk;
20     int t;
21     while(scanf("%lld",&n)!=EOF)
22     {
23         t=0;
24         n--;
25         m=n;
26         while(m)
27         {
28             t++;
29             m>>=1;
30         }
31         q=1;
32         m=(q<<(t-1));
33         ans=(m%mod)*((1+m)%mod)%mod;
34         ans=ans*quick_pow(2,mod-2)%mod;
35         n-=m;
36         kk=1;
37         k=2;
38         while(k<=n+kk)
39         {
40             ans=(ans%mod+(((n+kk)/k)%mod)*((kk%mod)*(kk%mod)%mod+1)%mod)%mod;
41             if(k==LLONG_MAX)
42                 break;
43             kk=k;
44             k<<=1;
45         }
46         printf("%lld\n",ans);
47     }
48     return 0;
49 }
View Code

 

C.Sum

技术分享

样例输入

1
1

样例输出

89999999999999999999999999

输入啥都输出233个9就行了。k个9无论乘多少数位和仍是k*9。
技术分享
 1 #include<bits/stdc++.h>
 2 #define clr(x) memset(x,0,sizeof(x))
 3 #define clr_1(x) memset(x,-1,sizeof(x))
 4 #define LL long long
 5 using namespace std;
 6 int main()
 7 {
 8     LL n,m,k;
 9     int T;
10     scanf("%d",&T);
11     while(T--)
12     {
13         scanf("%lld",&n);
14         for(int i=1;i<=233;i++)
15             printf("9");
16         printf("\n");
17     }
18     return 0;
19 }
View Code

B.Coin

技术分享

 

 

样例输入

2
2 1 1
3 1 2

样例输出

500000004
555555560


23333,n重伯努利实验概率分布题。
设q=1-p,p为事件概率。
Y为出现偶数次的概率。
技术分享

所以Y=(1+(q-p)^n)/2,求个逆元啥的,快速幂啥的就能做出来了。

技术分享
 1 #include<bits/stdc++.h>
 2 #define LL long long
 3 #define mod 1000000007
 4 using namespace std;
 5 LL quick_pow(LL x, LL n) {
 6     LL res = 1;
 7     x=(x%mod+mod)%mod;
 8     while(n) {
 9         if(n&1)
10             res=res*x% mod;
11         n >>=1;
12         x =x*x% mod;
13     }
14     return res;
15 }
16 int main()
17 {
18     LL p, q;
19     LL n;
20     int t;
21     scanf("%d", &t);
22     while(t --) {
23         scanf("%lld%lld%lld",&p, &q, &n);
24         LL a=quick_pow(p,mod-2);
25         a=(a*2*q)%mod;
26         a=(1-a+mod)%mod;
27         a=quick_pow(a,n)%mod;
28         a=(a+1)%mod;
29         LL b=quick_pow(2,mod-2)%mod;
30         a=(a*b)%mod;
31         printf("%lld\n", (a%mod+mod)%mod);
32     }
33 }
View Code

 



2017 icpc 西安网络赛

标签:ret   turn   最大流最小割   数位   分布   quick   name   long   while   

原文地址:http://www.cnblogs.com/wujiechao/p/7533410.html

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