热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【bzoj4002】[JLOI2015]有意义的字符串数论+矩阵乘法

题目描述B君有两个好朋友,他们叫宁宁和冉冉。有一天,冉冉遇到了一个有趣的题目:输入b;d;n,求输入一行三个整数b;d;n输出一行一个数表示模7528443412579

题目描述

B 君有两个好朋友,他们叫宁宁和冉冉。有一天,冉冉遇到了一个有趣的题目:输入 b;d;n,求

那么an一定恒为整数。

将n=1代入,可知两个±号一定相同,于是只有2种情况

再由通项公式求递推公式,发现只有一种情况符合条件,即:

,通项公式为

根据题目条件b mod 2=1,d mod 4=1可知前面的系数都为整数,于是可以矩阵乘法来推。

推完之后再讨论后一项的影响即可。

ps: n可能等于0,所以需要特判或者从a0开始推。

ps2: 题目中mod较大,需要用到unsigned long long和快速乘

#include 
#include 
#include 
#define mod 7528443412579576937ull
using namespace std;
typedef unsigned long long ull;
ull qmul(ull x , ull y)
{
    ull ans = 0;
    while(y)
    {
        if(y & 1) ans = (ans + x) % mod;
        x = (x + x) % mod;
        y >>= 1;
    }
    return ans;
}
struct matrix
{
    int n , m;
    ull num[2][2];
    matrix()
    {
        n = m = 0 , memset(num , 0 , sizeof(num));
    }
    matrix operator*(matrix a)
    {
        matrix t;
        t.n = n , t.m = a.m;
        int i , j , k;
        for(i = 0 ; i >= 1;
    }
    return t;
}
int main()
{
    ull b , d , n , x , y , ans;
    scanf("%llu%llu%llu" , &b , &d , &n);
    x = b , y = (d - b * b) / 4;
    A.n = 1 , A.m = 2 , A.num[0][0] = 2 , A.num[0][1] = b;
    B.n = 2 , B.m = 2 , B.num[0][1] = y , B.num[1][0] = 1 , B.num[1][1] = x;
    ans = (A * qpow(B , n)).num[0][0];
    if(y && n % 2 == 0) ans = (ans + mod - 1) % mod;
    printf("%llu\n" , ans);
    return 0;
}

推荐阅读
author-avatar
贪婪黑夜面_780
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有