• 2017 icpc 西安网络赛


    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
    ");
    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
    ",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
    ",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("
    ");
    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
    ", (a%mod+mod)%mod);
    32     }
    33 }
    View Code
    
    
    
    
  • 相关阅读:
    【学习笔记】整除分块
    【Luogu P2201】【JZOJ 3922】数列编辑器
    【SSL1786】麻将游戏
    【SSL2325】最小转弯问题
    【JZOJ 3910】Idiot 的间谍网络
    【Luogu P1879】[USACO06NOV]玉米田Corn Fields
    【JZOJ 3909】Idiot 的乘幂
    【JZOJ 3918】蛋糕
    【Luogu P3174 】[HAOI2009]毛毛虫
    【SSL1194】最优乘车
  • 原文地址:https://www.cnblogs.com/wujiechao/p/7533410.html
Copyright © 2020-2023  润新知