Bubble Cup X - Finals [Online Mirror] B. Neural Network country 矩阵快速幂加速转移

B. Neural Network country

time limit per test

2 seconds

memory limit per test

256 megabytes

Due to the recent popularity of the Deep learning new countries are starting to look like Neural Networks. That is, the countries are being built deep with many layers, each layer possibly having many cities. They also have one entry, and one exit point.

There are exactly L layers, each having N cities. Let us look at the two adjacent layers L1 and L2. Each city from the layer L1 is connected to each city from the layer L2 with the traveling cost cij for , and each pair of adjacent layers has the same cost in between their cities as any other pair (they just stacked the same layers, as usual). Also, the traveling costs to each city from the layer L2are same for all cities in the L1, that is cij is the same for , and fixed j.

Doctor G. needs to speed up his computations for this country so he asks you to find the number of paths he can take from entry to exit point such that his traveling cost is divisible by given number M.

Input

The first line of input contains N (1 ≤ N ≤ 106), L (2 ≤ L ≤ 105) and M (2 ≤ M ≤ 100), the number of cities in each layer, the number of layers and the number that travelling cost should be divisible by, respectively.

Second, third and fourth line contain N integers each denoting costs 0 ≤ cost ≤ M from entry point to the first layer, costs between adjacent layers as described above, and costs from the last layer to the exit point.

Output

Output a single integer, the number of paths Doctor G. can take which have total cost divisible by M, modulo 109 + 7.

Example

input

2 3 134 62 13 4

output

2

Note

This is a country with 3 layers, each layer having 2 cities. Paths , and  are the only paths having total cost divisible by 13. Notice that input edges for layer cities have the same cost, and that they are same for all layers.

题意:

  给你一个起点,和一个终点

  中间这个图是L层的,每层到每层的每个点都有一条权值为b[i]的有向边

  起点到第一层每个点 也有一条权值为a[i]的有向边,最后一层每个点到终点也有一条权值为c[i]有向边,给出a,b,c,求出路径和能整除M的方案数

#include <bits/stdc++.h>
inline long long read(){long long x=0,f=1;char ch=getchar();while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}return x*f;}
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
const double pi = acos(-1.0);
const long long INF = 1e18+1LL;

const int N = 2000000, mod = 1000000007;

struct Matix {
    LL arr[105][105];
}fi,se,ff;

int n,L,M;

Matix multi (Matix a, Matix b,int p) {
    Matix ans;
    memset(ans.arr,0,sizeof(ans.arr));
    if(p) {
        for(int i = 0; i < M; i++) {
            for(int j = 0; j < M; j++) {
                for(int k = 0; k < M; k++)
                    ans.arr[(i+j)%M][0] += (a.arr[i][k] * b.arr[k][j])%mod,
                ans.arr[(i+j)%M][0] %= mod;
            }
        }
    }
    else {
        for(int i = 0; i < M; ++i) a.arr[i][0] = a.arr[0][i];
        for(int i = 0; i < M; i++) {
            for(int j = 0; j < M; j++) {
                for(int k = 0; k < M; k++)
                    ans.arr[0][(i+j)%M] += (a.arr[i][k] * b.arr[k][j])%mod,
                ans.arr[0][(i+j)%M] %= mod;
            }
        }
    }
    return ans;
}

Matix pows(Matix an,Matix a,LL x) {
    while(x) {
        if(x&1) an=multi(an,a,1);
        a=multi(a,a,0);
        x/=2;
    }
    return an;
}
int ar[N];
int main() {
    cin >> n >> L >> M;
    for(int i = 1; i <= n; ++i) {
        int x;
        scanf("%d",&x);
        fi.arr[x % M][0] += 1;
    }
    for(int i = 1; i <= n; ++i) {
        int x;
        scanf("%d",&x);
        se.arr[0][x % M] += 1;
        ar[i] = x;
    }
    fi = pows(fi,se,L-2);
    memset(ff.arr,0,sizeof(ff.arr));
    for(int i = 1; i <= n; ++i) {
        int x;
        scanf("%d",&x);
        ff.arr[0][(x+ar[i]) % M] += 1;
    }
    fi = multi(fi,ff,1);
    LL ans = fi.arr[0][0];
    printf("%lld\n",((ans)%mod+mod)%mod);
    return 0;
}

  

时间: 2024-10-29 05:48:40

Bubble Cup X - Finals [Online Mirror] B. Neural Network country 矩阵快速幂加速转移的相关文章

Bubble Cup X - Finals [Online Mirror]

来自FallDream的博客,未经允许,请勿转载,谢谢. 组了个菜鸡队打cf上的ACM比赛 比较快做完了8题但是菜的抠脚罚时巨多,所以最后被顶到了19名(居然没出首页) 自己的号自从上次疯狂掉分就没动过了,感觉像是红名橙名大佬中的一股清流. A.奇怪的贪心,我写了一发结果挂了,题解见大爷博客 B.dp方程很容易列出来,然后写个矩阵乘法就行了. C.每个点的位置决定了两边的白色小三角形的面积,这个面积是关于位置的一次函数,所以排序之后贪心就行了. D.二分+网络流判定 E.dp方程容易列出,然后换

Bubble Cup 11 - Finals [Online Mirror, Div. 1] 体验记 + 部分题解

原文链接https://www.cnblogs.com/zhouzhendong/p/CF1045.html 体验?? 陈老爷(cly_none) 带我们飞. 遥遥领先的yzy(yzyyylx) nb . fx 口胡大法好. 哈哈.最后7~8分钟卡常 5974ms 过一道 6000ms 题. 陈老爷切掉了 A D J . yzy 干掉了 C 和 G . fx 半程口胡.中途有事. zzd 菜鸡贡献10多发罚时,导致队伍罚时爆炸.这个菜鸡zzd只 AC 了 I B H ,并在最后7~8分钟把陈老爷

Bubble Cup 8 finals G. Run for beer (575G)

题意: 给定一个带权无向图,每条边的代价为边权/当前速度,每次到达一个新节点,速度都会除以10. 求0号点到n-1号点的最小代价,如果多解输出点数最少的解,输出代价.路径点数.路径经过的点. 1<=边数<=10^5, 1<=点数<=10^5, 0<=边权<=9 题解: 比较有趣的一道题…难度不算太高,但一些地方比较容易想错… 这题的边代价可变本身并不是什么大问题,因为是图中所有边一起变大, 但是一开始就会遇到一个问题,就是总代价数字过大,没有办法直接存储和比较. 观察到

Bubble Cup 8 finals C. Party (575C)

题意: 给定n个人,分两天晚上去夜总会开派对,要求每天恰好有n/2个人去,且每人去的夜总会各不相同. 每个人对不同的晚上不同的夜总会有不同的满意度,求一个方案使得所有人的满意度之和最大. 夜总会数量=人的数量=n,2<=n<=20,且n是偶数. 0<=每一项满意度<=10^6. 时间限制2s,空间限制4MB. 题解: 在这题上卡了很久… 初看这题觉得是费用流…写完发现图建错了… 然后改成暴力枚举哪些人在第一天晚上去再跑费用流… 每个人只和对应晚上的夜总会连边,然后两天晚上的夜总会再

Bubble Cup 8 finals B. Bribes (575B)

题意: 给定一棵n个点和有向边构成的树,其中一些边是合法边,一些边是非法边, 经过非法边需要1的费用,并且经过之后费用翻倍. 给定一个长为m的序列,问从点1开始按顺序移动到序列中对应点的总费用. 1<=n<=10^5, 1<=m<=10^6 题解: 还是比较水的… 正解是各种方法求LCA,在点上打标记,最后DFS一遍就可以得到答案. 用tarjan求LCA可以做到总复杂度O(n*α)… 我傻傻地见树就剖,强行O(n log n log n)碾过去了… 每次把起点终点之间的路径的经过

Bubble Cup 8 finals H. Bots (575H)

题意: 简单来说就是生成一棵树,要求根到每个叶子节点上的路径颜色排列不同, 且每条根到叶子的路径恰有n条蓝边和n条红边. 求生成的树的节点个数. 1<=n<=10^6 题解: 简单计数. 显然,前n层的边的颜色是任意的,所以第i层就是2^i个点. 对于后n层,可以直接由上一层转移. 因为已经知道上一层合法的个数,那么如果现在每个点扩展两条边, 那么上一层的状态中,某种颜色的个数已经达到n的情况就有一条边不可扩展, 所以要减去2*C(i-1,n). 1 2 3 4 5 6 7 8 9 10 11

Bubble Cup 8 finals D. Tablecity (575D)

题意: (无输入,纯输出题) 一个城市用1000列2行的格子表示,一个小偷藏在城市的某一处. 在每一小时的开始, 在(X, Y)位置的小偷可以移动到 (X - 1, Y), (X + 1, Y),(X - 1, Y - 1), (X - 1, Y + 1), (X + 1, Y - 1), (X + 1, Y + 1)中的任意一个位置. 在每一小时中,警察可以控制搜索两个格子,如果小偷藏在这个格子就会被发现. 请输出一种方案, 使得在2015小时内,对于小偷的初始位置和移动方法的所有可能情况都能

Bubble Cup 8 finals I. Robots protection

题意: 有一个正方形区域, 要求支持两个操作: 1.放置三角形,给定放置方向(有4个方向,直角边与坐标轴平行),直角顶点坐标,边长 2.查询一个点被覆盖了多少次 1<=正方形区域边长n<=5000 1<=询问数<=10^5 保证输入合法,三角形被正方形区域完全包含. 题解: 嗯这是一道数据结构题… 一开始我想起来之前做过但没做出来的一道三角形修改三角形查询的分块题… 然后…GEOTCBRL说,是k-d tree呀,CF上面有标程代码长度限制的… 然而我并不会用k-d tree做这个

Bubble Cup 8 finals E. Spectator Riots (575E)

题意: 一个长宽是100000单位的球场上有很多暴动的观众,每个观众都有一个速度v, 在一秒内,观众会等概率地移动到与原位置的曼哈顿距离<=v的地方(不会移动到界外). 你需要选取三个位置,这三个位置要求满足在一秒之后可能会出现观众. (这里不需要考虑概率大小,只要概率不为0就是满足的) 然后过这三点作圆,请选取在初始状态一秒后圆内观众数的期望值最大的方案输出. 如果有多种,输出半径最大的方案. 题解: 第一眼看起来非常可怕… 什么每秒移动速度呀…什么期望呀…先被吓死就做不了了… 其实是假装要扯