洛谷 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;
} 

就这么多啦,溜了溜了

posted @ 2020-06-10 10:03  草鱼泡酒  阅读(128)  评论(0)    收藏  举报