杭电ACM-LCY算法进阶培训班-专题训练(01-05-09-13)
1007 Tr A
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
#define inf 0x7fffffff
#define ll long long
#define int long long
//#define double long double
#define eps 1e-4
//#define mod 1e9+7
#define ls(p) p<<1
#define rs(p) p<<1|1
#define pi acos(-1.0)
using namespace std;
const int mod=9973;
const int M=5e6;
const int N=1e3+5;//?????????? 4e8
int n,m;
int ans[N][N],d[N][N],x[N][N];
void get()
{
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++)
{
d[i][j]=ans[i][j];
ans[i][j]=0;
}
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) for(int k=1;k<=n;k++)
ans[i][j]=(ans[i][j]+(x[i][k]*d[k][j])%mod)%mod;
}
void cal()
{
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++)
{
d[i][j]=x[i][j];
x[i][j]=0;
}
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) for(int k=1;k<=n;k++)
x[i][j]=(x[i][j]+(d[i][k]*d[k][j])%mod)%mod;
}
void solve()
{
cin>>n>>m;
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%lld",&x[i][j]),ans[i][j]=x[i][j];
m--;
while(m)
{
if(m&1) get();
m>>=1;
cal();
}
int sum=0;
for(int i=1;i<=n;i++) sum=(sum+ans[i][i])%mod;
cout<<sum;
// for(int i=1;i<=n;i++)
// {
// for(int j=1;j<=n;j++) printf("%lld ",ans[i][j]);
// puts("");
// }
}
signed main()
{
int T=1;
cin>>T;
for(int index=1;index<=T;index++)
{
solve();
puts("");
}
return 0;
}
1008 A Simple Math Problem
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
#define inf 0x7fffffff
#define ll long long
//#define int long long
//#define double long double
#define eps 1e-4
//#define mod 1e9+7
#define ls(p) p<<1
#define rs(p) p<<1|1
#define pi acos(-1.0)
using namespace std;
//const int mod=9973;
const int M=5e6;
const int N=1e2+5;//?????????? 4e8
int n=10,m,mod;
int x[N][N],ans[N][N],d[N][N];
void get()
{
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++)
{
d[i][j]=ans[i][j];
ans[i][j]=0;
}
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) for(int k=1;k<=n;k++)
ans[i][j]=(ans[i][j]+(x[i][k]*d[k][j])%mod)%mod;
}
void cal()
{
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++)
{
d[i][j]=x[i][j];
x[i][j]=0;
}
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) for(int k=1;k<=n;k++)
x[i][j]=(x[i][j]+(d[i][k]*d[k][j])%mod)%mod;
}
void quick()
{
memset(ans,0,sizeof(ans));
for(int i=1;i<=10;i++) ans[i][i]=1;
while(m)
{
if(m&1) get();
m>>=1;
cal();
}
}
void solve()
{
while(cin>>m>>mod)
{
memset(x,0,sizeof(x));
for(int i=1;i<=10;i++) scanf("%d",&x[1][i]);
for(int i=2;i<=10;i++) x[i][i-1]=1;
if(m<10) cout<<m%mod<<endl;
else
{
m-=9;
quick();
int cnt=0;
for(int i=1;i<=10;i++) cnt=(cnt+ans[1][i]*(10-i)%mod)%mod;
cout<<cnt<<endl;
}
}
}
signed main()
{
int T=1;
// cin>>T;
for(int index=1;index<=T;index++)
{
solve();
// puts("");
}
return 0;
}
1009 Queuing
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
#define inf 0x7fffffff
#define ll long long
//#define int long long
//#define double long double
#define eps 1e-4
//#define mod 1e9+7
#define ls(p) p<<1
#define rs(p) p<<1|1
#define pi acos(-1.0)
using namespace std;
const int mod=9973;
const int M=5e6;
const int N=1e6+5;//?????????? 4e8
int n,m;
char x[N-4][31];
//void get()
//{
// for(int i=1;i<=n;i++) for(int j=1;j<=n;j++)
// {
// d[i][j]=ans[i][j];
// ans[i][j]=0;
// }
// for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) for(int k=1;k<=n;k++)
// ans[i][j]=(ans[i][j]+(x[i][k]*d[k][j])%mod)%mod;
//}
//void cal()
//{
// for(int i=1;i<=n;i++) for(int j=1;j<=n;j++)
// {
// d[i][j]=x[i][j];
// x[i][j]=0;
// }
// for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) for(int k=1;k<=n;k++)
// x[i][j]=(x[i][j]+(d[i][k]*d[k][j])%mod)%mod;
//}
void solve()
{
for(int i=1;i<=30;i++)
{
x[1][i]=2%i;
x[2][i]=4%i;
x[3][i]=6%i;
x[4][i]=9%i;
for(int j=5;j<=N;j++) x[j][i]=(x[j-1][i]+x[j-3][i]+x[j-4][i])%i;
}
while(cin>>n>>m) printf("%d\n",x[n][m]);
}
signed main()
{
int T=1;
// cin>>T;
for(int index=1;index<=T;index++)
{
solve();
// puts("");
}
return 0;
}
1010 Count
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
#define inf 0x7fffffff
#define ll long long
#define int long long
//#define double long double
#define eps 1e-4
//#define mod 1e9+7
#define ls(p) p<<1
#define rs(p) p<<1|1
#define pi acos(-1.0)
using namespace std;
const int mod=123456789;
const int M=5e6;
const int N=6;//?????????? 4e8
struct node
{
int c[N][N];
node operator * (const node x) const
{
node ans;
for(int i=0;i<N;i++) for(int j=0;j<N;j++) ans.c[i][j]=0;
// for(int i=0;i<N;i++) ans.c[i][i]=1;
for(int i=0;i<N;i++) for(int j=0;j<N;j++) for(int k=0;k<N;k++) ans.c[i][j]=(ans.c[i][j]+c[i][k]*x.c[k][j]%mod)%mod;
return ans;
}
}b;
int n=6,m;
int a[N][N]={
{1,2,1,0,0,0},
{1,0,0,0,0,0},
{0,0,1,3,3,1},
{0,0,0,1,2,1},
{0,0,0,0,1,1},
{0,0,0,0,0,1}};
node quick()
{
node ret;
for(int i=0;i<N;i++) for(int j=0;j<N;j++) ret.c[i][j]=0;
for(int i=0;i<N;i++) ret.c[i][i]=1;
while(m)
{
if(m&1) ret=ret*b;
b=b*b;
m>>=1;
}
return ret;
}
void solve()
{
cin>>m;
if(m<3) cout<<m;
else
{
for(int i=0;i<N;i++) for(int j=0;j<N;j++) b.c[i][j]=a[i][j];
m-=2;
node t=quick();
int cnt=(t.c[0][0]*2+t.c[0][1]+t.c[0][2]*27+t.c[0][3]*9+t.c[0][4]*3+t.c[0][5]*1)%mod;
cout<<cnt;
}
}
signed main()
{
int T=1;
cin>>T;
for(int index=1;index<=T;index++)
{
solve();
puts("");
}
return 0;
}
1011 Sum of Tribonacci Numbers
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
#define inf 0x7fffffff
#define ll long long
#define int long long
//#define double long double
#define eps 1e-4
//#define mod 1e9+7
#define ls(p) p<<1
#define rs(p) p<<1|1
#define pi acos(-1.0)
using namespace std;
const int mod=1e9+7;
const int M=5e6;
const int N=5;//?????????? 4e8
int val[]={0,1,1,1,2};
struct node
{
int c[N][N];
node operator * (const node x) const
{
node ans;
for(int i=1;i<N;i++) for(int j=1;j<N;j++) ans.c[i][j]=0;
for(int i=1;i<N;i++) for(int j=1;j<N;j++) for(int k=1;k<N;k++) ans.c[i][j]=(ans.c[i][j]+c[i][k]*x.c[k][j]%mod)%mod;
return ans;
}
}b;
int m;
int a[N][N]={
{0,0,0,0,0},
{0,0,1,0,0},
{0,0,0,1,0},
{0,1,1,1,0},
{0,0,0,1,1}
};
node quick()
{
node ret;
for(int i=0;i<N;i++) for(int j=0;j<N;j++) ret.c[i][j]=0;
for(int i=0;i<N;i++) ret.c[i][i]=1;
while(m)
{
if(m&1) ret=ret*b;
b=b*b;
m>>=1;
}
return ret;
}
int get(int n)
{
if(n<0) return 0;
if(n==0) return 1;
if(n==1) return 2;
node t;
m=n-1;
for(int i=0;i<N;i++) for(int j=0;j<N;j++) b.c[i][j]=a[i][j];
t=quick();
int ans=0;
for(int i=1;i<=4;i++) ans=(ans+t.c[4][i]*val[i]%mod)%mod;
return ans;
}
void solve()
{
int x,y;
while(cin>>x>>y) cout<<(get(y)-get(x-1)+mod)%mod<<endl;
}
signed main()
{
int T=1;
// cin>>T;
for(int index=1;index<=T;index++)
{
solve();
// puts("");
}
return 0;
}
1012 Another kind of Fibonacci
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
#define inf 0x7fffffff
#define ll long long
#define int long long
//#define double long double
#define eps 1e-4
//#define mod 1e9+7
#define ls(p) p<<1
#define rs(p) p<<1|1
#define pi acos(-1.0)
using namespace std;
const int mod=1e4+7;
const int M=5e6;
const int N=5;//?????????? 4e8
int val[]={0,1,1,1,2};
int n;
struct node
{
int c[N][N];
node operator * (const node x) const
{
node ans;
for(int i=1;i<N;i++) for(int j=1;j<N;j++) ans.c[i][j]=0;
for(int i=1;i<N;i++) for(int j=1;j<N;j++) for(int k=1;k<N;k++) ans.c[i][j]=(ans.c[i][j]+c[i][k]*x.c[k][j]%mod)%mod;
return ans;
}
}b;
int m;
//int a[N][N]={
// {0,0,0,0,0},
// {0,0,1,0,0},
// {0,0,0,1,0},
// {0,1,1,1,0},
// {0,0,0,1,1}
// };
node quick(node ret)
{
// node ret;
// for(int i=0;i<N;i++) for(int j=0;j<N;j++) ret.c[i][j]=0;
// for(int i=0;i<N;i++) ret.c[i][i]=1;
while(m)
{
if(m&1) ret=ret*b;
b=b*b;
m>>=1;
}
return ret;
}
int get(int x,int y,int k)
{
m=k;
int g[N][N]={
{0,0,0,0,0},
{0,1,0,0,0},
{0,1,x*x,1,x},
{0,0,y*y,0,0},
{0,0,2*x*y,0,y},
};
for(int i=0;i<N;i++) for(int j=0;j<N;j++) b.c[i][j]=g[i][j];
int a[N][N]={
{0,0,0,0,0},
{0,1,1,1,1},
{0,0,0,0,0},
{0,0,0,0,0},
{0,0,0,0,0},
};
node t;
for(int i=0;i<N;i++) for(int j=0;j<N;j++) t.c[i][j]=a[i][j];
t=quick(t);
return t.c[1][1];
}
void solve()
{
int x,y;
while(cin>>n>>x>>y) cout<<get(x%mod,y%mod,n)<<endl;
}
signed main()
{
int T=1;
// cin>>T;
for(int index=1;index<=T;index++)
{
solve();
// puts("");
}
return 0;
}
1013 Kiki & Little Kiki 2
//#pragma GCC optimize(2)
//#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
#define inf 0x7fffffff
#define ll long long
#define int long long
//#define double long double
#define eps 1e-4
//#define mod 1e9+7
#define ls(p) p<<1
#define rs(p) p<<1|1
#define pi acos(-1.0)
using namespace std;
const int mod=1e9+7;
const int M=5e6;
const int N=1e2+5;//?????????? 4e8
int n;
string s;
int len;
struct node
{
int c[N][N];
node operator * (const node x) const
{
node ans;
for(int i=0;i<=len;i++) for(int j=0;j<=len;j++) ans.c[i][j]=0;
for(int i=0;i<len;i++) for(int j=0;j<len;j++) ans.c[0][i]^=c[0][j]&x.c[j][i];
for(int i=1;i<len;i++) for(int j=0;j<len;j++) ans.c[i][j]=ans.c[i-1][(j-1+len)%len];
return ans;
}
}b;
int m;
node quick()
{
node ret;
for(int i=0;i<N;i++) for(int j=0;j<N;j++) ret.c[i][j]=0;
for(int i=0;i<len;i++) ret.c[i][i]=1;
while(m)
{
if(m&1) ret=ret*b;
b=b*b;
m>>=1;
}
return ret;
}
void get()
{
len=s.size();
for(int i=0;i<N;i++) for(int j=0;j<N;j++) b.c[i][j]=0;
for(int i=1;i<len;i++) b.c[i][i]=b.c[i][i-1]=1;
b.c[0][0]=b.c[0][len-1]=1;
node t=quick();
for(int i=0;i<len;i++)
{
int ans=0;
for(int j=0;j<len;j++) ans^=t.c[i][j]&(s[j]-'0');
printf("%lld",ans);
}
puts("");
}
void solve()
{
while(cin>>m>>s) get();
}
signed main()
{
int T=1;
// cin>>T;
for(int index=1;index<=T;index++)
{
solve();
// puts("");
}
return 0;
}