首页 > 其他分享 >暑假集训csp提高模拟10

暑假集训csp提高模拟10

时间:2024-07-28 18:06:13浏览次数:12  
标签:10 int sum long 集训 FILE using csp mod

赛时 rank 19,T1 0,T2 25 T3 10 T4 100

T3 挂了10pts?

数学专场,套路专场,烧脑专场。

幸亏我还有缓存的李超树博客,最后一个小时就溜了去打数据结构。

数学好难,拜谢数学。

T1 黑暗型高松灯

Company Acquisitions

要用势能分析,鞅的停时定理。由于赛时这个放T1非常逆天,所以整场比赛的奖励也十分逆天。
image

不会做,跳了。

T2 速度型高松灯

[HNOI2011] 数学作业

按位考虑,矩阵快速幂。

点此查看代码
#include<bits/stdc++.h>
#include<bits/extc++.h>
// using namespace __gnu_pbds;
// using namespace __gnu_cxx;
using namespace std;
#define infile(x) freopen(x,"r",stdin)
#define outfile(x) freopen(x,"w",stdout)
#define errfile(x) freopen(x,"w",stderr)
using ll=long long;using ull=unsigned long long;
using db = double;using ldb = long double;
#ifdef LOCAL
    FILE *InFile = infile("in.in"),*OutFile = outfile("out.out");
    // FILE *ErrFile=errfile("err.err");
#else
    FILE *Infile = stdin,*OutFile = stdout;
    //FILE *ErrFile = stderr;
#endif
#define int long long
int n,mod;
struct matrix{
	int s[3][3];
	matrix operator*(matrix a){
		matrix ans;
		memset(ans.s,0,sizeof ans.s);
		for(int i=0;i<3;i++)
		for(int j=0;j<3;j++)
		for(int k=0;k<3;k++)
		ans.s[i][j]=((ans.s[i][j]+a.s[i][k]*s[k][j])%mod+mod)%mod;
		return ans;
	}
}ans,base,k;
inline matrix new_one(){
	matrix a;
	memset(a.s,0,sizeof a.s);
	for(int i=0;i<3;i++)a.s[i][i]=1;
	return a;
}
inline matrix ksm(matrix a,int b){
	matrix ans = new_one();
	for(;b;b >>= 1,a = a*a)
	    if(b&1)ans = ans*a;
	return ans;
}
__int128_t ten[22];
signed main(){
    cin.tie(nullptr)->sync_with_stdio(false);
    cout.tie(nullptr)->sync_with_stdio(false);
	cin>>n>>mod;
	n++;
	ten[0]=1;
	for(int i=1;i<=20;i++)ten[i]=ten[i-1]*10;
	memset(base.s,0,sizeof base.s);
	k.s[0][0]=0,k.s[1][0]=0,k.s[2][0]=1;
	base.s[0][2]=1,base.s[1][2]=1,base.s[2][1]=-1,base.s[2][2]=2;
	for(int i=1;i<=(int)ceil(1+log(n)/log(10.0));i++){
		base.s[0][0]=ten[i]%mod;
		if(n<ten[i]){
			k=k*ksm(base,n-ten[i-1]);
			return cout<<k.s[0][0],0;
		}k=k*ksm(base,ten[i]-ten[i-1]);
	}
}

T3 力量型高松灯

简单题

莫反,有个恶心的\((i+j)^k\)

\[\begin{aligned} &\sum_{i=1}^n\sum_{j=1}^n(i+j)^k\mu^2(\gcd(i,j))\gcd(i,j)\\ =&\sum_{d=1}^n\mu^2(d)d\sum_{i=1}^n\sum_{j=1}^n(i+j)^k[\gcd(i,j)=d]\\ =&\sum_{d=1}^n\mu^2(d)d^{k+1}\sum_{i=1}^{\lfloor\frac nd\rfloor}\sum_{j=1}^{\lfloor\frac nd\rfloor}(i+j)^k[\gcd(i,j)=1]\\ =&\sum_{d=1}^n\mu^2(d)d^{k+1}\sum_{i=1}^{\lfloor\frac nd\rfloor}\sum_{j=1}^{\lfloor\frac nd\rfloor}(i+j)^k\sum_{e|i,e|j}\mu(e)\\ =&\sum_{e=1}^n\mu(e)e^k\sum_{d=1}^{\lfloor\frac ne\rfloor}\mu^2(d)d^{k+1}\sum_{i=1}^{\lfloor\frac n{de}\rfloor}\sum_{j=1}^{\lfloor\frac n{de}\rfloor}(i+j)^k\\ =&\sum_{T=1}^nS\left(\left\lfloor\frac nT\right\rfloor\right)T^k\sum_{d|T}\mu^2(d)\mu\left(\frac Td\right)d \end{aligned} \]

其中 \(S(n)=\sum_{i=1}^n\sum_{j=1}^n(i+j)^k\)。

考虑如何求\(S(n)\)

设\(F(n) = \sum_{i=1}^ni^k,G(n)=\sum_{i=1}^nF(i)\),那么\(S(n)=G(2n)-2G(n)\)

线筛加前缀和就可以了

考虑后面的\(\sum_{d|T}\mu^2(d)\mu\left(\frac Td\right)d\)怎么求

我们设T有一个质因数p,若\(T=p^{3\,or\,more }\times sth.\),那么后面的就是0。

然后就没了

点此查看代码
#include<bits/stdc++.h>
#include<bits/extc++.h>
// using namespace __gnu_pbds;
// using namespace __gnu_cxx;
using namespace std;
#define infile(x) freopen(x,"r",stdin)
#define outfile(x) freopen(x,"w",stdout)
#define errfile(x) freopen(x,"w",stderr)
using ll=long long;using ull=unsigned long long;
using db = double;using ldb = long double;
#ifdef LOCAL
    FILE *InFile = infile("in.in"),*OutFile = outfile("out.out");
    // FILE *ErrFile=errfile("err.err");
#else
    FILE *Infile = stdin,*OutFile = stdout;
    //FILE *ErrFile = stderr;
#endif
#define int long long
const int N = 1e7 + 10,mod = 998244353;
bitset<N> pd;
vector<int> prime;
int f[N],F[N],n,k;
inline int power(int a,int b,int mod){
    int res = 1;
    while(b){
        if(b&1) res = 1ll * res * a % mod;
        b >>= 1;
        a = 1ll * a * a % mod;
    }
    return res;
}
inline void Sieve(int n) {
	f[1] = F[1] = 1;
	for(int i = 2; i <= n; ++i) {
		if(!pd[i]) prime.push_back(i),f[i] = i - 1,F[i] = power(i,k,mod);
		for(auto j : prime) {
			if(i * j > n) break;
			int p = i * j;
			pd[p] = true;
			F[p] = 1ll * F[i] * F[j] % mod;
			if(i % j == 0) {
				int q = i / j;
				if(q % j) f[p] = 1ll * (mod - j) * f[q] % mod;
				break;
			} 
            f[p] = 1ll * f[i] * (j - 1) % mod;
		}
	}
	for(int i = 2; i <= n; ++i) f[i] = (f[i - 1] + 1ll * f[i] * F[i] % mod) % mod,F[i] = (F[i] + F[i - 1]) % mod;
	for(int i = 2; i <= n; ++i) F[i] = (F[i] + F[i - 1]) % mod;
}
inline int solve(int n){return (F[n<<1] - 2ll*F[n]%mod + mod)%mod;}
signed main(){
    cin.tie(nullptr)->sync_with_stdio(false);
    cout.tie(nullptr)->sync_with_stdio(false);
    cin>>n>>k;k %= (mod-1);
    Sieve(n<<1);
    ll ans = 0;
    for(int l = 1,r;l <= n;l = r + 1){
        r = n / (n / l);
        ans = (ans + 1ll * (f[r]-f[l-1]+mod)%mod*solve(n/l)%mod)%mod;
    }
    cout<<ans;
}

T4 高松灯

贪心。

从低到高填9,计算答案即可。
特判第一位,如果后面的超限,那么就填第一位的数字-1,反之就填第一位的数字。

点此查看代码
#include<bits/stdc++.h>
#include<bits/extc++.h>
// using namespace __gnu_pbds;
// using namespace __gnu_cxx;
using namespace std;
#define infile(x) freopen(x,"r",stdin)
#define outfile(x) freopen(x,"w",stdout)
#define errfile(x) freopen(x,"w",stderr)
using ll=long long;using ull=unsigned long long;
using db = double;using ldb = long double;
#ifdef LOCAL
    FILE *InFile = infile("in.in"),*OutFile = outfile("out.out");
    // FILE *ErrFile=errfile("err.err");
#else
    FILE *Infile = stdin,*OutFile = stdout;
    //FILE *ErrFile = stderr;
#endif
signed main(){
    cin.tie(nullptr)->sync_with_stdio(false);
    cout.tie(nullptr)->sync_with_stdio(false);
    ll n;cin>>n;
    ll ans = 0;
    bool flag = true;
    while(n > 9){
        int x = n % 10;
        if(x != 9) flag = false;
        ans += 9;
        n /= 10;
    }
    ans += (flag?n:n-1);
    cout<<ans;
}

总结

逆天模拟赛

标签:10,int,sum,long,集训,FILE,using,csp,mod
From: https://www.cnblogs.com/hzoi-Cu/p/18328603

相关文章

  • 实战|Qt开发WordBN笔记软件#10 添加Font Awesome字体图标
    01背景【WordBN字远笔记】是天恩软件工作室开发的一款免费笔记软件;WordBN基于VS2019、Qt6.5开发,使用QtQuick(QML)开发语言。本课程将以【WordBN字远笔记】的界面为实战基础,详细介绍如何基于Qt/QML开发语言,从零开始开发一套真正的程序,包括国际化、版本发布、安装包制作等项目......
  • Java基础10:拓展运算符、字符串连接符、三元运算符
    扩展运算符publicstaticvoidmain(String[]args){ inta=10; intb=20; a+=b;//a=a+b System.out.println(a+":"+b);}字符串连接符"+"运算符两侧的操作数中只要有一个是字符串(String)类型,系统会自动将另一个操作数转换为字符串然后再进行连接。//字符串......
  • CSP-S提高组数据结构算法模板大合集
    CSP-S算法总结2.2.1基础知识与编程环境无2.2.2C++程序设计2set/nultisetmap/multimapdeque/priority_queueSTL2.2.3数据结构P1886 滑动窗口/【模板】单调队列#include<iostream>usingnamespacestd;intn,k,a[1000005];intq[1000005],h,t;......
  • zzuli1057: 素数判定
    题目描述输入一个正整数n,判断n是否是素数,若n是素数,输出”Yes”,否则输出”No”。注意:1不是素数。输入输入一个正整数n(n<=1000)输出如果n是素数输出"Yes",否则输出"No"。输出占一行。样例输入2样例输出Yes本题考察求素数的方法,我在文章结束列举了3种方法,以......
  • zzuli1055: 兔子繁殖问题
    题目描述这是一个有趣的古典数学问题,著名意大利数学家Fibonacci曾提出一个问题:有一对小兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。按此规律,假设没有兔子死亡,第一个月有一对刚出生的小兔子,问第n个月有多少对兔子?输入输入月数n(1<......
  • 『模拟赛』暑假集训CSP提高模拟10
    RankA.黑暗型高松灯原[CF1025G]CompanyAcquisitions第一题直接上黑。B.速度型高松灯原[HNOI2011]数学作业想递推来着,但确实没考虑矩阵加速。对矩阵的掌握感觉也没那么好了,找机会复习得。按照下发题解里的矩阵是这样的:\[\begin{bmatrix}dp_i\\i+1\\1\end{bma......
  • 暑假集训第一周专题:树
    暑假集训第一周专题:树本专题其实还是看中对题目的阅读理解能力,dfs实现起来很简单,主要是知道题目到底要干嘛A.KuroandWalkingRoute题面输入输出思路即所有路线减去经过x到y的路线由x到y的路线,包括从某些点到x,经过一些点再到y,从y再到某些点有根据题目......
  • ssy暑假集训暴力算法学习笔记
    7.28集训第六天今天t大学的学长peop1e来给我们讲课啦!人好帅呀嘿嘿嘿....内容如下模拟退火:定义模拟退火可以分成两个部分,一个是"模拟",一个是"退火",先介绍什么叫退火,贴一张百度百科的图吧:\(\\\)那这"退火"的定义有啥用吗?模拟退火就是用来模拟整个退火的过程(其实没啥相似......
  • 算法笔记|Day10栈与队列II
    算法笔记|Day10栈与队列II☆☆☆☆☆leetcode150.逆波兰表达式求值题目分析代码☆☆☆☆☆leetcode239.滑动窗口最大值题目分析代码☆☆☆☆☆leetcode347.前K个高频元素(待补充)题目分析代码☆☆☆☆☆leetcode150.逆波兰表达式求值题目链接:leetcode150.......
  • gym102114K. Kaleidoscope
    神必burnside题题目大意给出一个60面体,求用n种颜色染色的方案数(旋转同构),第i种要用至少\(c_i\)次对p取模(p不是质数)展开图:题解显然一眼burnside/polya,考虑求出所有的置换感受一下,一个二维的正方形需要1种顺时针旋转90°得到所有置换,一个三维的正方体需要2种90°旋转得到所......