zoukankan      html  css  js  c++  java
  • JLOI2015 DAY1 简要题解

    「JLOI2015」有意义的字符串

    题意

    给你 (b, d, n)

    [[(frac{b + sqrt d}2)^n] mod 7528443412579576937 ]

    (0 < b^2 le d < (b + 1)^2 le 10^{18}, n le 10^{18})(b mod 2 = 1, d mod 4 = 1)

    题解

    我们把形式如果凑成

    [f(n) = (frac{b + sqrt d}2)^n + (frac{b - sqrt d} 2)^n ]

    不难发现这是一个二阶常系数线性递推式的通项公式。

    也就是有

    [f(n) = c_1f(n - 1) + c_2f(n - 2) ]

    我不太会特征方程求通项公式,打了下表。。不难发现就是

    [egin{cases} c_1 = b\ displaystyle c_2 = frac{d - b^2}4 end{cases} ]

    注意 (f(0) = 1, f(1) = c_1, f(2) = c_1^2 +c_2 imes 2) ,特判掉就行了。

    但我们要求得答案是

    [g(n) = [f(n) - (frac{b - sqrt d}2)^n] ]

    不难发现,当 (b ot = d^2)(n > 2, n mod 2 = 0) 的时候答案会少 (1) 。(打表发现的QAQ)

    用矩阵快速幂处理即可,模数很垃圾开个 __int128 就好了,复杂度是 (O(log n)) 的。

    代码

    #include <bits/stdc++.h>
    
    #define For(i, l, r) for (register int i = (l), i##end = (int)(r); i <= i##end; ++i)
    #define Fordown(i, r, l) for (register int i = (r), i##end = (int)(l); i >= i##end; --i)
    #define Rep(i, r) for (register int i = (0), i##end = (int)(r); i < i##end; ++i)
    #define Set(a, v) memset(a, v, sizeof(a))
    #define Cpy(a, b) memcpy(a, b, sizeof(a))
    #define debug(x) cout << #x << ": " << (x) << endl
    
    using namespace std;
    
    using ll = long long;
    
    template<typename T> inline bool chkmin(T &a, T b) { return b < a ? a = b, 1 : 0; }
    template<typename T> inline bool chkmax(T &a, T b) { return b > a ? a = b, 1 : 0; }
    
    void File() {
    #ifdef zjp_shadow
    	freopen ("2106.in", "r", stdin);
    	freopen ("2106.out", "w", stdout);
    #endif
    }
    
    const ll Mod = 7528443412579576937;
    
    struct Matrix {
    
    	ll a[2][2];
    
    	void Init() { Set(a, 0); }
    
    	void Unit() { Rep (i, 2) Rep (j, 2) a[i][j] = (i == j); }
    
    	inline Matrix friend operator * (const Matrix &lhs, const Matrix &rhs) {
    		Matrix res; res.Init();
    		Rep (i, 2) Rep (k, 2) Rep (j, 2)
    			res.a[i][j] = (res.a[i][j] + (__int128)(lhs.a[i][k]) * rhs.a[k][j]) % Mod;
    		return res;
    	}
    
    };
    
    ll b, d, n;
    
    Matrix fpm(Matrix x, ll power) {
    	Matrix res; res.Unit();
    	for (; power; power >>= 1, x = x * x)
    		if (power & 1) res = res * x;
    	return res;
    }
    
    int main () {
    
    	File();
    
    	cin >> b >> d >> n;
    
    	if (n == 0) return puts("1"), 0;
    
    	ll c1 = b, c2 = (d - b * b) / 4;
    
    	Matrix Base = (Matrix) {c1, 0, (ll)((__int128(c1) * c1 + c2 * 2) % Mod), 0}, trans = (Matrix) {0, 1, c2, c1};
    
    	if (n == 1) return printf ("%lld
    ", Base.a[0][0]), 0;
    	if (n == 2) return printf ("%lld
    ", Base.a[1][0]), 0;
    
    	Base = fpm(trans, n - 2) * Base;
    	cout << Base.a[1][0] - ((n & 1) || (d == b * b) ? 0 : 1) << endl;
    
    	return 0;
    
    }
    

    「JLOI2015」城池攻占

    原来写过 题解 ,就不再说了。。

    「JLOI2015」装备购买

    题意

    (n) 个物品,每个物品有代价 (c_i) ,和 (m) 个属性,用向量 (mathbf{z_i} = (a_1, dots, a_m)) 表示。

    你要选出尽量多的物品,使得代价尽量小,且使得任意一个物品不能被其他任意的几个物品的线性组合表示出来。

    (1 le n, m le 500; 0 le a_j le 1000)

    题解

    随意开开脑洞。

    不难发现就是求尽量多的线性无关变量。

    那么我们考虑把所有的物品按权值从小到大依次插入线性基就行了。

    复杂度是 (O(nm^2)) 的。至于除法,可以考虑模意义下的,不用考虑精度了。

    代码

    #include <bits/stdc++.h>
    
    #define For(i, l, r) for (register int i = (l), i##end = (int)(r); i <= i##end; ++i)
    #define Fordown(i, r, l) for (register int i = (r), i##end = (int)(l); i >= i##end; --i)
    #define Rep(i, r) for (register int i = (0), i##end = (int)(r); i < i##end; ++i)
    #define Set(a, v) memset(a, v, sizeof(a))
    #define Cpy(a, b) memcpy(a, b, sizeof(a))
    #define debug(x) cout << #x << ": " << (x) << endl
    
    using namespace std;
    
    template<typename T> inline bool chkmin(T &a, T b) { return b < a ? a = b, 1 : 0; }
    template<typename T> inline bool chkmax(T &a, T b) { return b > a ? a = b, 1 : 0; }
    
    inline int read() {
    	int x(0), sgn(1); char ch(getchar());
    	for (; !isdigit(ch); ch = getchar()) if (ch == '-') sgn = -1;
    	for (; isdigit(ch); ch = getchar()) x = (x * 10) + (ch ^ 48);
    	return x * sgn;
    }
    
    void File() {
    #ifdef zjp_shadow
    	freopen ("2108.in", "r", stdin);
    	freopen ("2108.out", "w", stdout);
    #endif
    }
    
    const int Mod = 998244353;
    
    inline int fpm(int x, int power) {
    	int res = 1;
    	for (; power; power >>= 1, x = 1ll * x * x % Mod)
    		if (power & 1) res = 1ll * res * x % Mod;
    	return res;
    }
    
    const int N = 510;
    
    int n, m;
    
    struct Array {
    	int a[N], cost;
    } T[N], Base[N];
    
    int main () {
    
    	File();
    
    	n = read(); m = read();
    
    	For (i, 1, n) For (j, 1, m) T[i].a[j] = read();
    	For (i, 1, n) T[i].cost = read();
    
    	sort(T + 1, T + n + 1, [&](Array lhs, Array rhs) { return lhs.cost < rhs.cost; });
    
    	int ans1 = 0, ans2 = 0;
    
    	For (i, 1, n) {
    		bool flag = false;
    		For (j, 1, m) {
    			if (T[i].a[j]) {
    				if (!Base[j].a[j]) {
    					flag = true; Base[j] = T[i]; break;
    				}
    				else {
    					int coef = 1ll * fpm(Base[j].a[j], Mod - 2) * T[i].a[j] % Mod;
    					For (k, j, m)
    						T[i].a[k] = (T[i].a[k] - 1ll * Base[j].a[k] * coef) % Mod;
    				}
    			}
    		}
    		if (flag) ++ ans1, ans2 += T[i].cost;
    	}
    
    	printf ("%d %d
    ", ans1, ans2);
    
    	return 0;
    
    }
    
  • 相关阅读:
    java.lang.ClassNotFoundException:org.springframework.web.context.ContextLoaderListener问题解决
    开发人员系统功能设计常用办公软件分享
    微信自定义菜单url默认80端口问题解决
    Servlet再度学习
    JSP九大内置对象
    linux下安装apache(httpd-2.4.3版本)各种坑
    Ajax原理学习
    Shell脚本了解
    生成Webservice的两种方式(Axis2,CXf2.x)
    Webservice发布
  • 原文地址:https://www.cnblogs.com/zjp-shadow/p/10357958.html
Copyright © 2011-2022 走看看