• 洛谷 P1313 【计算系数】


    这道题只要肯动手还是挺水的

    进入正题

    我们先枚举几个找找规律(这里先省略x,y):

    k = 0 :(1)

    k = 1 : (a) (b)

    k = 2 : (a^{2}) (2ab) (b^{2})

    k = 3 : (a^{3}) (3a^{2}b) (3ab^{2}) (b^{3})

    .......

    去掉(a)(b),就能发现他就是个杨辉三角,那我们就可以先预处理好杨辉三角(也可以打表
    我们继续观察,杨辉三角上是要乘上(a)(b)的,现在我们就要找该怎么乘了;观察次数,(a)的次数是(n)的大小,(b)也是(m)的大小,那么就可以先把(a)(b)乘方后的数乘到他们对应的杨辉三角的数;至于乘方,我用的快速幂,其实爆乘应该也可以,看喜好吧,只要每次都(%)去哪个规定的数就行了(没试过鸭)

    说了这么多,我们还没确定他们的位置,观察,由于杨辉三角的第一排其实不为(1),所以对应的行数也就是(k+1)了,在确定列,可以发现,其实就是(m+1);现在,就做出来啦


    接下来就是蒟蒻的代码啦!

    #include <bits/stdc++.h>
    using namespace std;
    long long a/*x*/ , b/*y*/ , k , m/*y*/ , n/*x*/ , mo = 10007 , ans;	//标记好对应的字母,以防带错值了 
    long long ret = 1; //快速幂的答案 
    long long f[10011][10011]; //杨辉三角 
    int main(){ 
        f[1][1] = 1; //杨辉三角的第一行为1,后面才好算嘛 
        for(int i = 2; i <= 1005; i++) //数据最大为1000,所以1000多就够了 
            for(int j = 1; j <= i; j++)
                f[i][j] = (f[i - 1][j - 1] % mo + f[i - 1][j]  % mo) % mo; //每一步都%,以防答案太大 
    	cin >> a >> b >> k >> n >> m;
    	ans = f[k + 1][m + 1]; //答案初始化了 
    	while(n){ //快速幂~~~ 
    		if(n % 2 == 1) ret = ret * a % mo;
    		n /= 2;
    		a = a * a % mo;
    	}
    	ans *= ret % mo;
    	ret = 1; //上一个用完就要初始化了 
    	while(m){
    		if(m % 2 == 1) ret = ret * b % mo;
    		m /= 2;
    		b = b * b % mo;
    	}
    	ans *= ret % mo;
    	cout << ans % mo;
    	return 0;
    } 
    

    就这么多啦,溜了溜了

  • 相关阅读:
    Java
    Java
    SpringBoot
    面对 DDoS 攻击,我们能做些什么?
    instanceof运算符的实质:Java继承链与JavaScript原型链
    从λ演算到函数式编程聊闭包(1):闭包概念在Java/PHP/JS中形式
    JIT-动态编译与AOT-静态编译:java/ java/ JavaScript/Dart乱谈
    JS遍历循环方法性能对比:for/while/for in/for of/map/foreach/every
    线程池的使用示例-批量查询
    国企离职鸡飞狗跳记
  • 原文地址:https://www.cnblogs.com/bzzs/p/13083262.html
Copyright © 2020-2023  润新知