『模拟赛』暑假集训CSP提高模拟10

Rank

image

A. 黑暗型高松灯

原[CF1025G] Company Acquisitions

第一题直接上黑。

B. 速度型高松灯

原[HNOI2011] 数学作业

想递推来着,但确实没考虑矩阵加速。

对矩阵的掌握感觉也没那么好了,找机会复习得。

按照下发题解里的矩阵是这样的:

[dpii+11]=[10k10011001][dpi1i1]

注意这个 k 是指 i 的位数,所以在对 n 以下不同位数要不同考虑。

还有就是,矩阵里的 10k 这一项可以提前取模,但指数上不行,所以求这一项的时候保留原型。

点击查看丑陋的代码
#include<bits/stdc++.h>
#define fo(x,y,z) for(register int (x)=(y);(x)<=(z);(x)++)
#define fu(x,y,z) for(register int (x)=(y);(x)>=(z);(x)--)
using namespace std;
typedef unsigned long long ll;
#define lx ll
inline lx qr()
{
	char ch=getchar();lx x=0,f=1;
	for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
	for(;ch>='0'&&ch<='9';ch=getchar())x=(x<<3)+(x<<1)+(ch^48);
	return x*f;
}
#undef lx
#define qr qr()
const int Ratio=0;
const int N=2e5+5;
ll n,mod;
int tot;
struct rmm
{
    ll a[5][5];
    rmm(){memset(a,0,sizeof a);}
};
rmm mul(rmm a,rmm b,int x,int y,int z)
{
    rmm c;
    fo(i,0,x-1)
        fo(j,0,y-1)
            fo(k,0,z-1)
                c.a[i][j]=(c.a[i][j]+a.a[i][k]*b.a[k][j]%mod+mod)%mod;
    return c;
}
rmm pow(rmm a,ll t)
{
    rmm b;
    fo(i,0,2) b.a[i][i]=1;
    while(t)
    {
        if(t&1) b=mul(a,b,3,3,3);
        a=mul(a,a,3,3,3);
        t>>=1;
    }
    return b;
}
namespace Wisadel
{
    ll Wqp(ll x,ll y)
    {
        ll res=1;
        while(y)
        {
            if(y&1) res=res*x;
            x=x*x;
            y>>=1;
        }
        return res;
    }
    short main()
    {
        // freopen(".in","r",stdin),freopen(".out","w",stdout);
        n=qr,mod=qr;
        ll xax=n;
        while(xax) tot++,xax/=10;
        rmm aa,bb;
        aa.a[0][0]=0,aa.a[0][1]=1,aa.a[0][2]=1;
        // bb.a[0][1]=0,bb.a[0][2]=0;
        // bb.a[1][0]=1,bb.a[1][1]=1,bb.a[1][2]=0;
        // bb.a[2][0]=0,bb.a[2][1]=1,bb.a[2][2]=1;
        fo(i,1,tot-1)
        {// 位数
            ll bol=Wqp(10,i);
            bb.a[0][0]=bol%mod,bb.a[0][1]=0,bb.a[0][2]=0;
            bb.a[1][0]=1,bb.a[1][1]=1,bb.a[1][2]=0;
            bb.a[2][0]=0,bb.a[2][1]=1,bb.a[2][2]=1;
            bb=pow(bb,bol-bol/10);
            aa=mul(aa,bb,1,3,3);
        }
        ll bol=Wqp(10,tot);
        bb.a[0][0]=bol%mod,bb.a[0][1]=0,bb.a[0][2]=0;
        bb.a[1][0]=1,bb.a[1][1]=1,bb.a[1][2]=0;
        bb.a[2][0]=0,bb.a[2][1]=1,bb.a[2][2]=1;
        bb=pow(bb,n+1-bol/10);
        aa=mul(aa,bb,1,3,3);
        printf("%lld\n",aa.a[0][0]);
        return Ratio;
    }
}
signed main(){return Wisadel::main();}

C. 力量型高松灯

原 P6156 简单题

感觉不是那么简单,需要用莫反,硬推式子应该也能做,等我推一推。

D. 高松灯

原[AGC021A] Digit Sum 2

调换 T1 T4 顺序可真是神了,导致我以为难度是降序所以 T2 打完暴力就摆了。

贪一下就行了,只有两种情况,一种就是原数,另一种是原数的最高位减一,剩下全是 9

状态还是不行,睡过头导致的。

明天开始还是早起去跑步吧。

放这套一眼全是数学的题估计就是为了让我们抓抓这个薄弱项,确实,菜就得多练。


完结撒花~

posted @   Ratio_Y  阅读(48)  评论(4编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
点击右上角即可分享
微信分享提示