您的位置:首页 > 编程语言 > C#

bc#29 做题笔记

2015-02-08 16:55 197 查看
昨天的bc被坑惨了= =

本来能涨rating的大好机会又浪费了。。。大号已弃号

A:第一反应是高精度,结果模板找不到了= =,然后现学现卖拍了个java的BigInteger+快速幂,调了好半天不说还TLE。貌似这题就在卡java

实际上尼玛等号两边取log不就完了么。。。



B:A题调了半天,开始做B的时候已经没多少时间了。。。

找出了斐波那契数列+前缀和的规律,结果把用矩阵快速幂求斐波那契前n项和的那个梗又忘了

最后out of submit time



事实证明还是要多做成套的题,这样才能发现很多平时难以察觉到的问题。

-------------------------------------------------

补上AC Code:

A:高你妹妹的高精度

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <vector>
using namespace std;
#define ULL long long
#define MOD 10000007

ULL ans,mx1,mx2;
ULL n,k,x;
typedef vector<ULL> vec;
typedef vector<vec> mat;
int a[100010];

mat mul(mat &A,mat &B)      //return A*B
{
mat C(A.size(),vec(B[0].size()));
for (int i=0;i<(int)A.size();i++)
{
for (int k=0;k<(int)B.size();k++)
{
for (int j=0;j<(int)B[0].size();j++)
{
C[i][j]=(C[i][j]+A[i][k]*B[k][j])%MOD;
}
}
}
return C;
}

mat m_pow(mat A,int m)      //return A^m
{
mat B(A.size(),vec(A.size()));
for (int i=0;i<(int)A.size();i++)
B[i][i]=1;
while (m>0)
{
if (m&1)    B=mul(B,A);
A=mul(A,A);
m>>=1;
}
return B;
}

int main()
{

//while (cin>>n>>k)
while (~scanf("%d%d",&n,&k))
{
mat AA(3,vec(3));
mat A(3,vec(3));
mat B(3,vec(3));
mat C(3,vec(1));
mat D(3,vec(1));
mat T(3,vec(1));
T[0][0]=2;  T[1][0]=1;  T[2][0]=1;
A[0][0]=1;  A[0][1]=1;  A[0][2]=1;
A[1][0]=0;  A[1][1]=1;  A[1][2]=1;
A[2][0]=0;  A[2][1]=1;  A[2][2]=0;
AA=A;
A=m_pow(A,k-2);
C=mul(A,T);
B=mul(A,AA);
//B=m_pow(B,k-1);
D=mul(B,T);
ULL FK=C[0][0],FKK=D[0][0]-1;
if (k==2)   {FK=2;  FKK=3;}
if (k==1)   {FK=1;  FKK=1;}
//cout<<FK<<"  --  "<<FKK<<endl;

/*
LL fk=1,fkk=2,FK=2,FKK=4;
for (int i=3;i<=k;i++)
{
//fk:f[k]   fkk:f[k+1]
LL tmp=fk+fkk;
fk=fkk; fkk=tmp;
fk=fk%MOD;
fkk=fkk%MOD;
FK+=fk;
FKK=FK+fkk;
FK=FK%MOD;
FKK=FKK%MOD;
}
FKK-=1;   if (FKK<0)    FKK+=MOD;
*/

ans=0;
mx1=0;  mx2=0;
for (int i=1;i<=n;i++)
{
cin>>x;
ans+=x;
if (x>mx1)
{
mx2=mx1;
mx1=x;
}
else if ((x<=mx1)&&(x>mx2))
{
mx2=x;
}
}
/*
for (int i=1;i<=n;i++)
{
cin>>a[i];
ans+=a[i];
}
sort(a+1,a+n+1);
mx1=a
;   mx2=a[n-1];
*/

//cout<<mx1<<"   "<<mx2<<" = "<<ans<<endl;
/*
for (int i=1;i<=k;i++)
{
ans=ans+mx1+mx2;
ans=ans%MOD;
LL tmp=mx1;
mx1=mx1+mx2;
mx2=tmp;
}
*/
//cout<<ans<<" - "<<FK<<" "<<FKK<<endl;
mx1=mx1*FKK;    mx1=mx1%MOD;
mx2=mx2*FK;   mx2=mx2%MOD;
ans=ans+mx1+mx2;
ans=ans%MOD;
//cout<<ans<<endl;
printf("%I64d\n",ans);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: