杭电ACM-LCY算法进阶培训班-专题训练 05

杭电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;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值