• 【2022年11月22日提高A组】数论计算【SPFA】【数学】


    在这里插入图片描述

    思路:

    设最小a为min
    发现如果 a 1 ∗ i 1 + a 2 ∗ i 2 + … … + a n ∗ i n a_1*i_1+a_2*i_2+……+a_n*i_n a1i1+a2i2++anin能达到 k ∗ m i n + t k*min+t kmin+t,那么后面这个加上多少个min,它都是能达到的。
    所以spfa出到达t这个余数的最小和是多少,然后直接 ( r − d i s ) / m i n (r-dis)/min (rdis)/min得出最多可以加几次

    c o d e code code

    #include
    #include
    #include
    #include
    #define ll long long
    
    using namespace std;
    
    const ll mod = 1e9 + 7;
    
    ll n, l, r, minn = 1e9;
    ll a[100], dis[1000010];
    bool v[1000010];
    
    void spfa(ll s) {
    	queue<ll> q;
    	q.push(s);
    	memset(dis, 0x7f, sizeof(dis));
    	dis[s] = 0;
    	v[s] = 1;
    	while(!q.empty()) {
    		ll x = q.front();
    		q.pop();
    		for(ll i = 1; i <= n; i ++) {
    			ll y = (x + a[i]) % minn;
    			if(dis[y] > dis[x] + a[i]) {
    				dis[y] = dis[x] + a[i];
    				if(!v[y]) {
    					q.push(y);
    					v[y] = 1;
    				}
    			}
    		}
    		v[x] = 0;
    	}
    }
    
    ll query_(ll x) {
    	ll ans = 0;
    	for(ll i = 0; i < minn; i ++)
    		if(x >= dis[i]) ans = (ans + (x - dis[i]) / minn + 1) % mod;
    	return ans;
    }
    
    int main() {
    	scanf("%lld%lld%lld", &n, &l, &r);
    	for(ll i = 1; i <= n; i ++) scanf("%lld", &a[i]), minn = min(a[i], minn);
    	spfa(0);
    	printf("%lld", (query_(r) - query_(l - 1) + mod) % mod);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
  • 相关阅读:
    springcloudalibaba架构(29): Seata分布式事务(AT模式)
    Python函数与Bug
    centos 安装指定版本mysql、redis
    实验二 分支结构程序设计(Python)
    Linux系统(Centos 8)环境安装
    MATLAB——BP神经网络信号拟合程序
    某设计院后备人才管理体系建设项目成功案例纪实
    C++ 信号处理
    大数据开发语言Scala入门
    java Date
  • 原文地址:https://blog.csdn.net/liuziha/article/details/127984268