U95001 a与b的加乘问题

U95001 a与b的加乘问题

题目背景
小Y已经是一名中学生了。一天他在做因式分解的题目时,遇到了一道关于(a+b)²的题,小Y很快就运用完全平方公式——(a+b)²=a²+2ab+b²解决了。可是善于思考的他想知道(a+b)的n次方该怎么求。你能帮帮他吗?

题目描述
给定一个正整数n和两个参数a和b的值,请你写出(a+b)的n次方化简后的各项,再求出(a+b)的n次方的值(考虑到最终结果可能很大,所以请将结果mod 1e9+7后输出,PS:请使用计算机的mod运算)。
PS:幂次方用()表示,1次方项请省略();
如:a²写作a(2)。

输入格式
共2行:
第1行:一个正整数n,表示(a+b)的指数;
第2行:两个整数,分别代表a与b的值。

输出格式
共(m+1)行【m为(a+b)的n次方化简后的项数】:
第1~m行:每行为(a+b)的n次方化简后的各项;
第(m+1)行:(a+b)的n次方mod 1e9+7后的值。

输入输出样例
输入 #1
2
3 4
输出 #1
a(2)
2ab
b(2)
49
输入 #2
3
10 11
输出 #2
a(3)
3a(2)b
3ab(2)
b(3)
9261

这道题其实巨简单
给个例子
(a+b)(1)=a+b
(a+b)(2)=a(2)+2ab+b(2)
(a+b)(3)=a(3)+3a(2)b+3ab(2)+b(3)
(a+b)(4)=a(4)+4a(3)b+6a(2)b(2)+4ab(3)+b(4)
次数规律不用我说了吧~~
把这个系数列出来
1 1
1 2 1
1 3 3 1
1 4 6 4 1
看到没有 magic!
杨辉三搞(角)hing(形)呀

只需要来一个递推杨辉三角加上乱输出一通就行了呀~
于是我就快乐的打了一波杨辉三角形

void yu()
{
	l=n+1;
	for(long long i=1;i<=l;i++)
	{
		dp[i][1]=1;
		dp[i][i]=1;
	}
	for(long long i=2;i<=l;i++)
		for(long long j=1;j<=i;j++)
			dp[i][j]=dp[i-1][j-1]+dp[i-1][j];
}

加上了 一个 magic的输出

	for(long long i=n;i>=0;i--)
	{
		long long k=n-i+1;
		if(dp[l][k]!=1)cout<<dp[l][k];
		if(i!=0)
		{
			if(i!=1)printf("a(%lld)",i);
			else if(i==1) printf("a");
		}
		long long j=n-i;
		if(j!=0)
		{
			if(j!=1)printf("b(%lld)",j);
			else if(j==1) printf("b");
		}
		printf("\n");
	}

最后 再输出一个 Pow 美滋滋~

	printf("%lld",pow(a+b,n));

高高兴兴拿0分

交上去 来 我才没那么傻~
502行杨辉三角形 你用long long?
萎掉了 哥
接下来就是我们家阔(bian)耐(tai)的高精度
话说 高精度是一个令人忧愁的东西

string jia(string a,string b)
{
	int x=0,lena=a.size(),lenb=b.size(),lenc=0;
	string s="",r="";
	while(lenc<lena||lenc<lenb)
	{
		int i=lena-lenc-1,j=lenb-lenc-1,k=0;
		if(a[i]>='0'&&a[i]<='9'&&i>=0&&i<lena)k+=int(a[i])-48;
		if(b[j]>='0'&&b[j]<='9'&&j>=0&&j<lenb)k+=int(b[j])-48;
		k+=x;
		x=k/10;
		k=k%10;
		s+=char(k+48);
		lenc++;
	}
	 if(x!=0)s+=char(x+48);
	 int ls=s.size()-1;
	 while(s[ls]=='0'&&ls>1)ls--;
	 for(int i=ls;i>=0;i--)
	 	r+=s[i];
	return r;
}

总算打完高精度了 交上去了吧~
耶~
终于结束了

嗝屁~又WA了?
(3+4)(500) ?我用pow?
高精度乘方?嗝屁~
眼睛是个好东西 可惜我没有

重点提示:
题目描述
给定一个正整数n和两个参数a和b的值,请你写出(a+b)的n次方化简后的各项,再求出(a+b)的n次方的值(

考虑到最终结果可能很大,所以请将结果mod 1e9+7后输出,PS:请使用计算机的mod运算

)。
PS:幂次方用()表示,1次方项请省略();
如:a²写作a(2)。

So?
快快乐乐打乘方?
想我这种高大帅气风流倜傥的人才不会那么Low
人家要打就打快速幂

来来来

long long quicklymod(long long a,long long n)
{
	if(n==0)return 1;
	if(n==1)return a;
	long long ans=quicklymod(a%mod,n/2)%mod;
	ans=(ans%mod*ans%mod)%mod;
	if(n%2==1)
		ans=(ans%mod*a%mod)%mod;
	return ans;
}

开心 打完了 耶~
最后附上 AC代码

 #include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<map>
#include<ctime>
#define N 10000+5
#define mod 1000000007
#define f(i,j,k) for(long long i=j;i<=k;i++)
#define f1(i,j,k) for(long long i=j;i>=k;i--)
using namespace std;
long long n,a,b,l;
string dp[503][1000+5];
string jia(string a,string b)
{
	int x=0,lena=a.size(),lenb=b.size(),lenc=0;
	string s="",r="";
	while(lenc<lena||lenc<lenb)
	{
		int i=lena-lenc-1,j=lenb-lenc-1,k=0;
		if(a[i]>='0'&&a[i]<='9'&&i>=0&&i<lena)k+=int(a[i])-48;
		if(b[j]>='0'&&b[j]<='9'&&j>=0&&j<lenb)k+=int(b[j])-48;
		k+=x;
		x=k/10;
		k=k%10;
		s+=char(k+48);
		lenc++;
	}
	 if(x!=0)s+=char(x+48);
	 int ls=s.size()-1;
	 while(s[ls]=='0'&&ls>1)ls--;
	 for(int i=ls;i>=0;i--)
	 	r+=s[i];
	return r;
}
void yu()
{
	l=n+1;
	for(long long i=1;i<=l;i++)
	{
		dp[i][1]="1";
		dp[i][i]="1";
	}
	for(long long i=2;i<=l;i++)
		for(long long j=1;j<=i;j++)
			dp[i][j]=jia(dp[i-1][j-1],dp[i-1][j]);
}
long long quicklymod(long long a,long long n)
{
	if(n==0)return 1;
	if(n==1)return a;
	long long ans=quicklymod(a%mod,n/2)%mod;
	ans=(ans%mod*ans%mod)%mod;
	if(n%2==1)
		ans=(ans%mod*a%mod)%mod;
	return ans;
}
int main()
{
	scanf("%lld",&n);
	scanf("%lld%lld",&a,&b);
	yu();
	for(long long i=n;i>=0;i--)
	{
		long long k=n-i+1;
		if(dp[l][k]!="1")cout<<dp[l][k];
		if(i!=0)
		{
			if(i!=1)printf("a(%lld)",i);
			else if(i==1) printf("a");
		}
		long long j=n-i;
		if(j!=0)
		{
			if(j!=1)printf("b(%lld)",j);
			else if(j==1) printf("b");
		}
		printf("\n");
	}
	printf("%lld",quicklymod(a+b,n));
	while(1);//拒绝抄袭
	return 0;
}

撒花结束~~~~~~~~~~~~~~~~~~~~~~~~~~~


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值