记录编号 |
222864 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
[NOI 2013]矩阵游戏 |
最终得分 |
100 |
用户昵称 |
Satoshi |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.165 s |
提交时间 |
2016-02-05 12:14:47 |
内存使用 |
2.22 MiB |
显示代码纯文本
#include <fstream>
#define N 1000000
using namespace std;
typedef long long ll;
ifstream in("matrixb.in");
ofstream out("matrixb.out");
ll mod=1e9+7;
ll a,b,c,d,m=0,n=0;
char s1[N+10],s2[N+10];
ll phi;
ll ans=0;
class vector
{
public:
ll x,y;
void make(ll aaa,ll bbb)
{
x=aaa;
y=bbb;
}
}t1,t2,t3;
vector operator *(vector a,vector b)
{
vector c;
c.x=(a.x*b.x)%mod;
c.y=(a.x*b.y+a.y)%mod;
return c;
}
vector pow(vector o,ll k)
{
vector c;
k--;
c=o;
while(k)
{
if(k&1)c=c*o;
o=o*o;
k=k>>1;
}
return c;
}
void init(char *s,ll &sum)
{
int i;
for(i=0;s[i];i++)
{
sum=(sum*10+s[i]-'0')%phi;
}
}
void read()
{
in>>s1>>s2>>a>>b>>c>>d;
if(a==1&&c==1)phi=mod;
else phi=mod-1;
init(s1,n);init(s2,m);
t1.make(a,b);
t2.make(c,d);
//out<<n<<' '<<m<<' '<<a<<' '<<b<<' '<<c<<' '<<d<<endl;
}
void work()
{
t1=pow(t1,m-1);
t3=t2*t1;
t3=pow(t3,n-1);
t1=t1*t3;
ans=(t1.x+t1.y)%mod;
out<<ans<<endl;
}
int main()
{
read();
work();
return 0;
}