您的位置:首页 > 其它

bzoj3240 noi2013矩形游戏

2016-02-24 21:47 411 查看
作为一个不是很会用矩阵的人QAQQQQQQQQ,我们考虑下构造一下下等比数列,然后用推出来的通项公式解决.......数学渣算了好几次QAQQQQ

然而UOJ的hack并没有通过QAQQQQQQQ,并没能发现为什么

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#define LL long long
#define fo(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
LL read()
{
LL d=0,f=1;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();}
return d*f;
}
#define N 1000010
#define inf 1000000007
LL a,b,c,d,n,m;
LL n1,m1;

void give(char *s,LL &k,LL mod)
{
int len=strlen(s);
fo(i,0,len-1)
k=(k*10+s[i]-'0')%mod;
}

LL f(LL a,LL b)
{
if(b==1)return a;
if(b==0)return 1;
if(b==2)return a*a%inf;
LL t=f(a,b/2);t=t*t;t%=inf;
if(b%2)return (t*a)%inf;
else return t;
}

LL ny(LL a)
{
return f(a,inf-2);
}

int main()
{
char ch1
,ch2
;
scanf("%s%s",ch1,ch2);
a=read(),b=read(),c=read(),d=read();
give(ch1,n,inf-1);give(ch2,m,inf-1);
give(ch1,n1,inf);give(ch2,m1,inf);
int flag=1;
if(a!=1&&c==1&&d==1)flag=0;
if(a==1)
{
b=(b*(m1-1)%inf*c+d)%inf;
a=c;
}else
{
LL t=b*ny(a-1)%inf;
LL an=f(a,m-1);
b=(t*(an-1)%inf*c+d)%inf;
a=(an*c)%inf;
}
// cout<<a<<' '<<b<<endl;
LL ans=0;
if(a==1)ans=(1+n1*b)%inf;
else
{
LL t=b*ny(a-1)%inf;
LL an=f(a,n);
ans=((an-1)*t%inf+an)%inf;
}
ans-=d;
ans*=ny(c);
ans%=inf;
ans+=inf;
ans%=inf;
cout<<ans<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数学 数论