• 计算系数


    传送门: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子

  • 相关阅读:
    C语言二维数组
    Foxyproxy 火狐代理插件
    Midas Civil的钢束生成器
    foobar2000 – ELPlaylist
    Foobar2000-CUI 小结
    Foobar2000–panel stack splitter
    Foobar2000 使用说明
    foobar2000-new
    书匠
    图片转文字 ocr 汉王
  • 原文地址:https://www.cnblogs.com/peppa/p/9436804.html
Copyright © 2020-2023  润新知