#define Code using
#define by namespace
#define stringdp100005 std
#include<bits/stdc++.h>
#define int long long
Code by stringdp100005;
const int mod=1e9+7,modd=1e9+6;
class Matrix{
private:
int row,col;
int **val;
public:
Matrix(int x,int y){
row=x,col=y;
val=new int*[row];
for(int i=0;i<row;i++)
val[i]=new int[col];
}
void clear(){
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
val[i][j]=0;
}
}
}
void setIdentity(){
if(row!=col){
cerr<<"[Error]The rows and columns of this matrix are not equal";
return ;
}
clear();
for(int i=0;i<row;i++){
val[i][i]=1;
}
}
int getVal(int x,int y){
return val[x][y];
}
void changeVal(int x,int y,int v){
val[x][y]=v;
}
istream& inputVal(istream& in,int x,int y){
in>>val[x][y];
return in;
}
friend Matrix operator +(Matrix n,Matrix m){
if(n.row!=m.row||n.col!=m.col){
cerr<<"[Error]The rows and columns of these two matrixes are not equal.";
}
Matrix res=Matrix(n.row,n.col);
for(int i=0;i<res.row;i++){
for(int j=0;j<res.col;j++){
res.val[i][j]=n.val[i][j]+m.val[i][j];
}
}
return res;
}
friend Matrix plusMod(Matrix n,Matrix m){
if(n.row!=m.row||n.col!=m.col){
cerr<<"[Error]The rows and columns of these two matrixes are not equal.";
}
Matrix res=Matrix(n.row,n.col);
for(int i=0;i<res.row;i++){
for(int j=0;j<res.col;j++){
res.val[i][j]=(n.val[i][j]+m.val[i][j])%mod;
}
}
return res;
}
friend Matrix operator *(int n,Matrix m){
Matrix res=Matrix(m.row,m.col);
for(int i=0;i<res.row;i++){
for(int j=0;j<res.col;j++){
res.val[i][j]=n*m.val[i][j];
}
}
return res;
}
friend Matrix numMod(int n,Matrix m){
Matrix res=Matrix(m.row,m.col);
for(int i=0;i<res.row;i++){
for(int j=0;j<res.col;j++){
res.val[i][j]=n*m.val[i][j]%mod;
}
}
return res;
}
friend Matrix operator *(Matrix n,Matrix m){
if(n.col!=m.row){
cerr<<"[Error]The columns of the matrix N are not equal to the rows of the matrix M.";
}
Matrix res=Matrix(n.row,m.col);
res.clear();
for(int i=0;i<n.row;i++){
for(int j=0;j<m.col;j++){
for(int k=0;k<n.col;k++){
res.val[i][j]+=n.val[i][k]*m.val[k][j];
}
}
}
return res;
}
friend Matrix mulMod(Matrix n,Matrix m){
if(n.col!=m.row){
cerr<<"[Error]The columns of the matrix N are not equal to the rows of the matrix M.";
}
Matrix res=Matrix(n.row,m.col);
res.clear();
for(int i=0;i<n.row;i++){
for(int j=0;j<m.col;j++){
for(int k=0;k<n.col;k++){
res.val[i][j]=(res.val[i][j]+n.val[i][k]*m.val[k][j]%mod)%mod;
}
}
}
return res;
}
friend Matrix operator ^(Matrix n,int m){
Matrix res=Matrix(n.row,n.row);
res.setIdentity();
while(m){
if(m&1) res=res*n;
n=n*n;
m>>=1;
}
return res;
}
friend Matrix powMod(Matrix n,int m){
Matrix res=Matrix(n.row,n.row);
res.setIdentity();
while(m){
if(m&1) res=mulMod(res,n);
n=mulMod(n,n);
m>>=1;
}
return res;
}
friend istream& operator >>(istream& in,Matrix m){
for(int i=0;i<m.row;i++){
for(int j=0;j<m.col;j++){
in>>m.val[i][j];
}
}
return in;
}
friend ostream& operator <<(ostream& out,Matrix m){
for(int i=0;i<m.row;i++){
for(int j=0;j<m.col;j++){
out<<m.val[i][j]<<" ";
}
out<<endl;
}
return out;
}
};
Matrix ANS1(2,2),ANS2(2,2);
int n,m,a,b,c,d;
string sn,sm;
void init(){
ANS1.clear(),ANS2.clear();
ANS1.changeVal(0,0,a),ANS1.changeVal(1,0,b),ANS1.changeVal(1,1,1);
ANS2.changeVal(0,0,c),ANS2.changeVal(1,0,d),ANS2.changeVal(1,1,1);
}
signed main(){
cin>>sn>>sm>>a>>b>>c>>d;
int lenn=sn.size(),lenm=sm.size();
for(int i=0;i<lenn;i++){
if(a==1) n=(n*10+sn[i]-'0')%mod;
else n=(n*10+sn[i]-'0')%modd;
}
for(int i=0;i<lenm;i++){
if(c==1) m=(m*10+sm[i]-'0')%mod;
else m=(m*10+sm[i]-'0')%modd;
}
init();
ANS1=mulMod(powMod(mulMod(powMod(ANS1,m-1),ANS2),n-1),powMod(ANS1,m-1));
cout<<(ANS1.getVal(0,0)+ANS1.getVal(1,0))%mod;
return 0;
}
代码很长,辛苦一下~
你发给 AI 就好了
@陈俊哲 等一下这怎么是 zlf 的代码?@stringdp100005
?Code by stringdp100005;
炸裂。
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int mod = 1e9 + 7, modd = 1e9 + 6;
class Matrix {
private:
int row, col;
int **val;
public:
Matrix(int x, int y) {
clear();
row = x, col = y;
val = new int*[row];
for (int i = 0; i < row; i++)
val[i] = new int[col];
}
void clear() {
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
val[i][j] = 0;
}
}
}
void setIdentity() {
if (row != col) {
cerr << "[Error]The rows and columns of this matrix are not equal";
return ;
}
clear();
for (int i = 0; i < row; i++) {
val[i][i] = 1;
}
}
int getVal(int x, int y) {
return val[x][y];
}
void changeVal(int x, int y, int v) {
val[x][y] = v;
}
friend Matrix operator *(int n, Matrix m) {
Matrix res = Matrix(m.row, m.col);
for (int i = 0; i < res.row; i++) {
for (int j = 0; j < res.col; j++) {
res.val[i][j] = n * m.val[i][j];
}
}
return res;
}
friend Matrix mulMod(Matrix n, Matrix m) {
if (n.col != m.row) {
cerr << "[Error]The columns of the matrix N are not equal to the rows of the matrix M.";
}
Matrix res = Matrix(n.row, m.col);
res.clear();
for (int i = 0; i < n.row; i++) {
for (int j = 0; j < m.col; j++) {
for (int k = 0; k < n.col; k++) {
res.val[i][j] = (res.val[i][j] + n.val[i][k] * m.val[k][j] % mod) % mod;
}
}
}
return res;
}
friend Matrix powMod(Matrix n, int m) {
Matrix res = Matrix(n.row, n.row);
res.setIdentity();
while (m) {
if (m & 1) res = mulMod(res, n);
n = mulMod(n, n);
m >>= 1;
}
return res;
}
};
Matrix ANS1(2, 2), ANS2(2, 2);
int n, m, a, b, c, d;
string sn, sm;
void init() {
ANS1.changeVal(0, 0, a), ANS1.changeVal(1, 0, b), ANS1.changeVal(1, 1, 1);
ANS2.changeVal(0, 0, c), ANS2.changeVal(1, 0, d), ANS2.changeVal(1, 1, 1);
}
signed main() {
cin >> sn >> sm >> a >> b >> c >> d;
int lenn = sn.size(), lenm = sm.size();
for (int i = 0; i < lenn; i++) {
if (a == 1) n = (n * 10 + sn[i] - '0') % mod;
else n = (n * 10 + sn[i] - '0') % modd;
}
for (int i = 0; i < lenm; i++) {
if (c == 1) m = (m * 10 + sm[i] - '0') % mod;
else m = (m * 10 + sm[i] - '0') % modd;
}
init();
ANS1 = mulMod(powMod(mulMod(powMod(ANS1, m - 1), ANS2), n - 1), powMod(ANS1, m - 1));
cout << (ANS1.getVal(0, 0) + ANS1.getVal(1, 0)) % mod;
return 0;
}
顺便帮你把防抄袭去掉了
@陈俊哲 在这个网站粘贴代码,点那个小棒子就可以一键格式化
给个解决方案呗
十分实用的
nb!
授人以鱼不如授人以渔
给了
哈哈,就是!
我从来没写过这么长的代码,看到了想格式化一下,觉得看起来很解压。
所以到底为什么要用zlf代码啊
我最长就70多行。
不是抄袭,题都不知道是啥。
估计是楼主抄袭了缺省源(?)
不过这个解决方案好水呀(
不应该给 @stringdp100005 吗
emmm…
要不这样吧,谁解决这道题给谁:
mmh去S市参加学术研讨会,会议结束后Smmh决定要给他的k个门徒一人带一份伴手礼回来。
Smmh来到了当地最大的集市上,从集市入口到出口一共按顺序摆了n个摊位。咱们把n个摊位看成一条坐标轴,第i个摊位的位置坐标在xi上,而集市的出口的坐标在xend上。
带着伴手礼行走是需要消耗体力的,如果Smmh身上有a份伴手礼,没走一个格就要消耗a * a的体力,走d格则消耗d * a * a的体力。
每个摊位的伴手礼的价格为ci,库存为fi。Smmh可以沿途在任何一个摊位购买不超过当前摊位库存量的伴手礼。
Smmh作为书生,体力实在有限,钱财也实在有限,因此Smmh既想省钱又想省力。你能不能帮助Smmh计算出,在购买满k份伴手礼到达出口的前提下,让体力消耗+钱财消耗的和尽量小,这个最小值为多少?
输入描述
第一行三个整数k,xend,n。
接下来n行,每行三个整数xi,fi,ci。
输出描述
输出一行一个整数,表示最小的体力消耗+钱财消耗之和。
样例1
输入复制
2 5 3 3 1 2 4 1 2 1 1 1
输出
9
提示
样例解释
在位置3和4的摊位各购买一个伴手礼,总钱财消耗为4,总体力消耗为1+2*2=5。
数据范围
对于50%的数据1<=k<=500,1<=n<=100,1<=xi<=xend<=100,1<=ci<=10^4,1<=fi<=500。
对于100%的数据1<=k<=10^4,1<=n<=500,1<=xi<=xend<=500,1<=ci<=10^6,1<=fi<=10000。