[CSP-S模拟测试67]题解
时隔多年,终于又有了一套我能改完的题……
A.神炎皇
遇到这种要求整除的题显然拆出gcd
设$d=gcd(a,b)\ \ \ a'=\frac{a}{d} \ \ \ b'=\frac{b}{d}$
原式转化为$(a'd+b'd)|(a'db'd)$
$(a'+b')|(a'b'd)$
又因为$gcd(a',b')=1$
所以$a'+b'$一定不是$a'b'$的因子,进而得到$(a'+b')|d$
又由$a+b \leq n \rightarrow (a'+b')d \leq n \rightarrow a'+b' \leq \sqrt{n}$
不妨枚举$s=a'+b'$
那么满足$gcd(a',b')=1$的合法数对有多少个?
由更相减损术可得$gcd(a,b)=gcd(a+b,b)$
所以$a',b'$共$\varphi (s)$对
那合法的$d$也就只有$\frac{n}{s^2}$个
答案即$\sum \limits _{i=2}^{n} \varphi (i) \times \frac{n}{i^2}$
注意到当$i> \sqrt{n}$时每项为0,所以枚举到$\sqrt{n}$即可
复杂度$O(\sqrt{n})$。
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
typedef long long ll;
const int N=1e7+2;
ll n,ans,sqt;
int pr[N],vis[N],tot,phi[N];
void work() {
phi[1]=1;
for(int i=2;i<=sqt;i++)
{
if(!vis[i])pr[++tot]=i,phi[i]=i-1;
for(int j=1;j<=tot&&pr[j]*i<=sqt;j++)
{
vis[i*pr[j]]=1;
if(i%pr[j])phi[i*pr[j]]=phi[i]*(pr[j]-1);
else
{
phi[i*pr[j]]=phi[i]*pr[j];
break;
}
}
ans+=1LL*phi[i]*(n/(1LL*i*i));//cout<<ans<<endl;
}
}
int main()
{
scanf("%lld",&n);
sqt=sqrt(n);
work();
/*for(int i=1;i<=n;i++)
cout<<i<<' '<<phi[i]<<endl;*/
cout<<ans<<endl;
return 0;
}
B.降雷皇
就是LIS再加上求方案数……权值线段树可以一次性处理二者信息,每次查询当前序列值对应的最长公共子序列长度和方案数转移即可。注意区间查询左右边界问题。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#define pa pair<int,int>
using namespace std;
const int N=1e5+5;
int read()
{
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return x*f;
}
typedef long long ll;
const ll mod=123456789;
int n,a[N],type,side;
int ans,f[N<<2],res=1;
ll num,g[N<<2];
#define ls(k) (k)<<1
#define rs(k) (k)<<1|1
void up(int k)
{
f[k]=max(f[ls(k)],f[rs(k)]);
if(f[ls(k)]>f[rs(k)])g[k]=g[ls(k)];
else if(f[rs(k)]>f[ls(k)])g[k]=g[rs(k)];
else g[k]=(g[ls(k)]+g[rs(k)])%mod;
}
void ins(int k,int l,int r,int pos,int valf,ll valg)
{
if(l==r)
{
if(f[k]<valf)f[k]=valf,g[k]=valg;
else if(f[k]==valf)(g[k]+=valg)%=mod;
return ;
}
int mid=l+r>>1;
if(pos<=mid)ins(ls(k),l,mid,pos,valf,valg);
else ins(rs(k),mid+1,r,pos,valf,valg);
up(k);
}
void ask(int k,int l,int r,int L,int R)
{
if(L>R)return ;
if(L<=l&&R>=r)
{
if(ans<f[k])ans=f[k],num=g[k];
else if(ans==f[k])(num+=g[k])%=mod;
return ;
}
int mid=l+r>>1;
if(L<=mid)ask(ls(k),l,mid,L,R);
if(R>mid)ask(rs(k),mid+1,r,L,R);
} int main()
{
n=read();type=read();
for(int i=1;i<=n;i++)
a[i]=read(),side=max(side,a[i]);
int nowf=1;ll nowg=1;
ins(1,1,side,a[1],nowf,nowg);
for(int i=2;i<=n;i++)
{
ans=num=0;
ask(1,1,side,1,a[i]-1);
nowf=ans+1;nowg=max(1LL,num);
//cout<<nowf<<' '<<nowg<<endl;
res=max(res,nowf);
ins(1,1,side,a[i],nowf,nowg);
}
printf("%d\n",res);
if(!type)return 0;
ans=num=0;
ask(1,1,side,1,side);
printf("%lld\n",num);
return 0;
}
C.幻魔皇
第一步就跪了……根本没想到可以枚举距离
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5005;
const ll mod=123456789;
ll f[N],sum[N],ans[N<<1];
int n;
int main()
{
scanf("%d",&n);
f[1]=f[3]=1;sum[1]=sum[2]=1;sum[3]=2;
for(int i=4;i<=n;i++)
f[i]=(f[i-1]+f[i-2])%mod,sum[i]=(sum[i-1]+f[i])%mod;
for(int i=1;i<n;i++)
(ans[i]+=sum[n-i]*f[i+1]%mod)%=mod;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
int d1=i+j,d2=max(i,j);
(ans[d1]+=(sum[n-d2+1]-1)*f[j+1]%mod*f[i]%mod)%=mod;
}
for(int i=1;i<=n*2;i++)
printf("%lld ",ans[i]);
putchar('\n');
return 0;
}
[CSP-S模拟测试67]题解的更多相关文章
- CSP-S 模拟测试94题解
T1 yuuustu: 可以对两边取对数,然后就转化为两个double的比较,时间复杂度$O(n)$ 然后我就用神奇0.4骗分水过 #include<bits/stdc++.h> usin ...
- CSP-S模拟测试 88 题解
T1 queue: 考场写出dp柿子后觉得很斜率优化,然后因为理解错了题觉得斜率优化完全不可做,只打了暴力. 实际上他是可以乱序的,所以直接sort,正确性比较显然,贪心可证,然后就是个sb斜率优化d ...
- CSP-S 模拟测试92 题解
话说我怎么觉得我没咕多长时间啊,怎么就又落了20多场题解啊 T1 array: 根据题意不难列出二元一次方程,于是可以用exgcd求解,然而还有一个限制条件就是$abs(x)+abs(y)$最小,这好 ...
- CSP-S 模拟测试57题解
人生第一次A,B层一块考rank2,虽然说分差没几分,但还是值得纪念. 题解: T1 天空龙: 大神题,因为我从不写快读也没有写考场注释的习惯,所以不会做,全hzoi就kx会做,kx真大神级人物. T ...
- CSP-S 模拟测试 51 题解
考试过程: 惯例先看一遍三道题,T1 一开始反应要求割点,但是这是有向图,肯定不能求割点,康了一下数据范围,有40%是树的,还不错,决定待会在打. 看T2 字符串题,完了我字符串最弱了,肯定只能打暴力 ...
- CSP-S 模拟测试 45 题解
由于咕掉的题解太多了,所以只能趁改完不动题的时间,来补补坑qwq,还是太弱了. 考试过程: 到新机房的第一次考试,貌似海星? 第一题一开始就觉得是个贪心,但以为所有小怪兽都要打完,所以想复杂了,但后来 ...
- [CSP-S模拟测试97]题解
A.小盆友的游戏 感觉题解解释的很牵强啊……还是打表找规律比较靠谱 对于每个人,它构造了一个期望函数$f(x)$,设它的跟班个数为$cnt[x]$,那么令$f(x)=2^{cnt[x]}-1$(??鬼 ...
- [CSP-S模拟测试96]题解
以后不能再借没改完题的理由不写题解了…… A.求和 求$\sum \sum i+j-1$ 柿子就不化了吧……这年头pj都不考这么弱智的公式化简了…… 坑点1:模数不定,可能没有2的逆元,那么只要先把乘 ...
- [CSP-S模拟测试92]题解
A.数列 显然每个数的答案是互相独立的,直接扩欧求解.我们需要最小化$ax+by=gcd(a,b)$中的$|x|+|y|$,而显然当x或y靠近0时答案可能最优,列个不等式求一下即可. 能$O(1)$千 ...
随机推荐
- UOJ 450 【集训队作业2018】复读机——单位根反演
题目:http://uoj.ac/problem/450 重要式子: \( e^x = \sum\limits_{i=0}^{\infty} \frac{x^i}{i!} \) \( ( e^{a*x ...
- YII 1.0 常用CURD写法
<?php //yii1.0 curd简单写法 //查询 Yii::app()->db->createCommand($sql)->queryAll();//查询所有行数据 ...
- python的os.path.join()
在python中,os.path.join()是用来拼接目录路径得.同类型得还有join(),os.path.spilt(),spilt()三个函数.1,os.path.join(),将join()里 ...
- zabbix配置-模板
1.配置=>模板=>创建模板=>输入模板名称和群组 2.配置=>模板=>找到刚刚创建的模板=>点击应用集(applications)=>创建应用集=>输 ...
- Font and PDF
1. 独立存在的Font文件 有三类: Type 1 Font TrueType Font OpenType Font Type 1 是由Adobe开发的,它是基于PostScript的Font,它通 ...
- POJ 1410 Intersection (计算几何)
题目链接:POJ 1410 Description You are to write a program that has to decide whether a given line segment ...
- django-3-视图(views.py)与网址(urls.py)
视图与网址 操作文件:urls.py.views.py urls.py 作用:用于处理前台的链接(如前台访问:127.0.0.1:8080/index/1212/21212),其实永远访问的是同一个文 ...
- mysql FROM_UNIXTIME 时间不准确
mysql 使用 FROM_UNIXTIME 函数计算出来的时间少了6个小时或者8个小时 解决办法: 添加 default-time_zone = '+8:00' 这个再配置文件中 vi /etc/m ...
- 爬取拉勾网python工程师的岗位信息并生成csv文件
转载自:https://www.cnblogs.com/sui776265233/p/11146969.html 代码写得很好,但是目前只看得懂前一部分 一.爬取和分析相关依赖包 Python版本: ...
- Python3函数中特殊形参的使用:*、*args、**kwargs
Python3函数中特殊形参的使用:*.*args.**kwargs ==用法1:不定长参数== 当函数需要的参数数量不确定的时候,可以使用*args 和 **kwargs , 所有的位置参数保存在* ...