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;
}
撒花结束~~~~~~~~~~~~~~~~~~~~~~~~~~~