zoukankan      html  css  js  c++  java
  • 计算系数

    传送门:https://www.luogu.org/problemnew/show/P1313

     1 #include<cstdio>
     2 #include<algorithm>
     3 using namespace std;
     4 #define ll long long int
     5 int p = 10007,a,b,k,n,m;
     6 ll h[1001][1001],ans;
     7 ll prepare(int k,int n)
     8 {
     9     int i,j;
    10     for(i = 0;i <= k;i++)
    11     {
    12         for(j = 0;j <= n;j++)
    13         {
    14             if(i == 0 || j == 0 || j == i) h[i][j] = 1;
    15             else h[i][j] = (h[i-1][j-1] + h[i-1][j])%p;
    16         }
    17     }
    18     return h[k][n];
    19 }
    20 ll qpow(ll a,ll b)
    21 {
    22     ll ans = 1,base = a;
    23     while(b)
    24     {
    25         if(b&1)
    26             ans *= base,ans %= p;
    27         base *= base,base %= p;
    28         b >>= 1;
    29     }
    30     return ans;
    31 }
    32 int main()
    33 {
    34     scanf("%d%d%d%d%d",&a,&b,&k,&n,&m);
    35     ans = ((qpow(a%p,n) * qpow(b%p,m)) % p * prepare(k,min(n,m))) % p;
    36     printf("%lld",ans);
    37     return 0;
    38 }


    不气不气真不气,上帝住在我心里。

    这道题怎么算?用手算。

    这道题怎么看?用眼睛看。

    杨辉三角+快速幂。

    在a=1&b=1的情况下手算了几个式子,发现了这个跟杨辉三角有关,并且在角的哪一行与k有关,所以预处理杨辉三角时只需要处理到第k行。至于第几列,因为它是对称的,所以取m,n中较小的那个作为处理到的列数。但是当a或b不为1时,就需要算a^n*b^m再乘上h[k][n],这样以来就用到了快速幂。第一次交只得了20分,下载了第二个数据,发现结果总是负的,原来是处理杨辉三角时数太大溢出了,zx大佬说能取模就取模,于是在能取模的地方都取了,然后就A了。

    不气不气真不气,上帝住在我心里——pop子

  • 相关阅读:
    Java设计模式—状态模式
    Java设计模式—备忘录模式
    android AsyncTask介绍
    Android UI线程和非UI线程
    Java设计模式—代理模式
    Java设计模式—命令模式
    <Android 应用 之路> MPAndroidChart~PieChart
    FPGA的EPCS 配置的2种方法 FPGA下载程序的方法(EPCS)
    如何将.sof转换成.jic
    quartus ii工程文件的分析
  • 原文地址:https://www.cnblogs.com/peppa/p/9436804.html
Copyright © 2011-2022 走看看