首页 > 其他分享 >循环图

循环图

时间:2024-09-05 16:16:17浏览次数:8  
标签:tmp return matrix long 循环 n1 105

  • 抽丝剥茧到最后一步,你离成功解出这道题只剩下“矩阵等比数列求和”这个问题了。把式子写出来:\(M+M^2+M^3+...+M^k\),虽然没办法套用求和公式,但一定有办法的,看着它,用心感受,或者不妨先转移注意力——
  • 分治!分解原问题为结构相同的子问题,再将子问题的解合并成原问题的解!
  • 分治的过程中,如果调用power函数,总的时间复杂度大概会多出一个log,这是不能接受的;不妨新开一个全局变量,在递归的过程中顺便计算快速幂的值
点击查看代码
#include <bits/stdc++.h>
using namespace std;
const int mod=1000000007;
long long L,R;
vector<long long>a[105],c[105];
long long f[105],ans;
long long n;
class matrix
{
    public:
        matrix()
        {
            memset(a,0,sizeof(a));
        }
        long long a[105][105];
        void clear()
        {
            memset(a,0,sizeof(a));
        }
};
matrix pr;
matrix danwei()
{
	matrix res;
	for(long long i=1;i<=n;i++)
	{
		res.a[i][i]=1;
	}
	return res;
}
matrix operator+(matrix a,matrix b)
{
    matrix c;
    for(long long i=1;i<=n;i++)
    {
        for(long long j=1;j<=n;j++)
        {
            c.a[i][j]+=(a.a[i][j]+b.a[i][j]);
            c.a[i][j]%=mod;
        }
    }
    return c;
}
matrix operator*(matrix a,matrix b)
{
    matrix c;
    for(long long i=1;i<=n;i++)
    {
        for(long long j=1;j<=n;j++)
        {
            for(long long k=1;k<=n;k++)
            {
                c.a[i][j]+=(a.a[i][k]*b.a[k][j]%mod);
            }
            c.a[i][j]%=mod;
        }
    }
    return c;
}
matrix power(matrix n1,long long p)
{
	matrix res=danwei();
	for(p;p;p>>=1)
	{
		if((p&1)==1)
		{
			res=res*n1;
		}
		n1=n1*n1;
	}
	return res;
}
matrix P;
matrix fenzhi(matrix n1,long long p)
{
	if(p==1)
	{
		P=n1;
		return n1;
	}
	matrix tmp=fenzhi(n1,p/2),q=P;
	if(p%2==0)
	{
		P=P*P;
		return tmp+tmp*q;
	}
	else
	{
		P=P*P*n1;
		return tmp+tmp*q+q*q*n1;
	}
}
void calc(long long l,long long r)
{
	if(l>r)
	{
		return;
	}
	else if(l==r)
	{
		matrix val=power(pr,l-1);
		for(long long i=1;i<=n;i++)
		{
			long long n1=(l-1)*n+i;
			if(n1>=L&&n1<=R)
			{
				for(long long j=1;j<=n;j++)
				{
					ans=ans+f[j]*val.a[i][j]%mod;
					ans%=mod;
				}
			}
		}
	}
	else
	{
		matrix val=power(pr,l-2)*fenzhi(pr,r-l+1);
		for(long long i=1;i<=n;i++)
		{
			for(long long j=1;j<=n;j++)
			{
				ans=ans+f[j]*val.a[i][j]%mod;
				ans%=mod;
			}
		}
	}
}
int main() 
{
	int size(512<<20);
	__asm__ ( "movq %0, %%rsp\n"::"r"((char*)malloc(size)+size));
	ios::sync_with_stdio(false);
	cin.tie(0);
    long long T;
    cin>>T;
    while(T--)
    {
        long long m;
        cin>>n>>m>>L>>R;
        pr.clear();
        for(long long i=1;i<=n;i++)
        {
        	f[i]=0;
            a[i].clear();
            c[i].clear();
        }
        for(long long i=1;i<=m;i++)
        {
            long long u,v,w;
            cin>>u>>v>>w;
            if(v<=n)
            {
                a[v].push_back(u);
                c[v].push_back(w);
            }
            else
            {
                pr.a[v-n][u]=w;
            }
        }
        f[1]=1;
        for(long long i=1;i<=n;i++)
        {
            for(long long j=0;j<a[i].size();j++)
            {
                (f[i]+=(c[i][j]*f[a[i][j]]%mod))%=mod;
                for(long long k=1;k<=n;k++)
                {
                    pr.a[i][k]+=(pr.a[a[i][j]][k]*c[i][j]%mod);
                    pr.a[i][k]%=mod;
                }
            }
        }
        long long l=(L-1)/n+1;
        long long r=(R-1)/n+1;
        ans=0;
        if(l==r)
        {
        	calc(l,l);
        }
        else
        {
        	calc(l,l);
        	calc(r,r);
        	calc(l+1,r-1);
        }
        cout<<ans<<endl;
    }    
    exit(0);
}
/*
2
3 4 1 100
1 2 1
1 3 1
3 4 1
2 5 1
5 8 998244353 1000000007
1 2 114514
1 4 1919810
2 3 999999999
3 5 111111111
4 5 1000000000
1 10 123456789
5 6 987654321
3 9 888888888
*/

标签:tmp,return,matrix,long,循环,n1,105
From: https://www.cnblogs.com/watersail/p/18398706

相关文章

  • Linux循环分支
    今天给大家介绍的是Linux中的各种循环,这些循环的应用十分广泛,也是帮助提高工作效率的一种方法。for循环格式for变量名in值1值2值3#值的数量决定循环任务的次数do命令序列done输出100个数#!/bin/bashforiin{1..10}#不能用变量........
  • floyd算法,三重循环的顺序问题,不要写错了
     最外层的循环应该是,中间节点的变量从1~n:1for(k=1;k<=n;k++)2for(i=1;i<=n;i++)3for(j=1;j<=n;j++)4dist[i][j]=min(dist[i][j],dist[i][k]+dist[k][j]);  正确代码1#include<bits/stdc++.h>2usingname......
  • 两个进程实现通信,一个进程循环从终端输入,另一个进程循环打印,当输入quit时结束
    目录题目思路实现:input.coutput.c题目两个进程实现通信,一个进程循环从终端输入,另一个进程循环打印,当输入quit时结束这两个标志在两个进程里,是不共享的,所以为了共享标志位可以和buf封装到一个结构体里作为共享内存。structmsg{intflag;charbuf[32];};......
  • 【机器学习-神经网络】循环神经网络
    【作者主页】FrancekChen【专栏介绍】⌈⌈⌈Python机器学习⌋......
  • 编程新手必看:探索编程中的 for 循环20 种语言的实践与比较
    在这里我展示了20多种编程语言中的for循环实现。希望这些示例对大家学习不同语言的语法有帮助!1.C语言2.C++3.Python4.JavaScript5.Java6.Ruby7.Swift8.Go9.Rust10.Kotlin11.PHP12.TypeScript13.Perl14.Haskell15.Scala16.Julia17.R18.MATLAB19.Lua......
  • 学习C语言之分支和循环(下)。都是练习,桀桀桀。
    <一>、闰年的判断 <二>、找出100~200内的素数 <三>、猜数字第一种:  第二种:  第三种:限定次数  ......
  • ArkUI-07-循环视图(ForEach循环加载列表)
    效果和源码。import{createCollaborationCameraMenuItems}from'@hms.collaboration.camera'classItem{name:stringimage:ResourceStrprice:numberconstructor(name:string,image:ResourceStr,price:number){this.name=namethis.i......
  • [数据结构] 循环队列
    front:头指针rear:尾指针maxsize:数组长度循环队列通常会让留空数组中的一位,区分队列为空和队列为满的状态。入队移动rear,出队移动front。形式1(默认):front指向队头元素的前一位,而rear指向队尾元素。队列为空:front==rear队列为满:front==(rear+1)%maxsize元素个数:(r......
  • 学习C语言之分支与循环(上)桀桀桀
     晚上好各位,桀桀桀。上面就是我们今天的内容了话不多说,开干。    <一>、if语句1.if语句的语法形式如下:if(表达式) 语句表达式成⽴(为真),则语句执⾏,表达式不成⽴(为假),则语句不执⾏。在C语⾔中,0为假,⾮0表⽰真,也就是表达式的结果如果是0,则语句不执⾏,表达式......
  • Bean的循环依赖问题
    什么是Bean的循环依赖Bean的循环依赖,就是A对象中有B属性,B对象中有A属性。即我依赖你,你也依赖我。也就是两个或多个对象之间相互引用成环。比如:丈夫类Husband,妻子类Wife,Husband中有Wife的引用,Wife中有Husband的引用。packagecw.spring.bean;/***ClassName:Wife*P......