[Codeforces #174] Tutorial
Link:
A:
求原根的个数,有一条性质是原根个数为$\phi(\phi(n))$,多了一个不会证的性质
如果要确定哪些是原根的话还是要枚举,不过对于每个数不用枚举$p$次了
由于$\delta_p(x) | \phi(x)$,只要对欧拉函数值的约数枚举即可
不过此题好像直接$O(p^2)$枚举就行了……
- #include <bits/stdc++.h>
- using namespace std;
- #define X first
- #define Y second
- typedef long long ll;
- typedef pair<int,int> P;
- typedef double db;
- int p,res;
- int main()
- {
- scanf("%d",&p);
- for(int i=;i<p;i++)
- {
- bool f=;int t=;
- for(int j=;j<=p-;j++)
- {
- t=(t*i)%p;
- if(t==) f=;
- }
- if(t*i%p!=) f=;
- res+=f;
- }
- printf("%d",res);
- return ;
- }
Problem A
B:
简单分类
- #include <bits/stdc++.h>
- using namespace std;
- int n,A,I;char s[];
- int main()
- {
- scanf("%d%s",&n,s+);
- for(int i=;i<=n;i++)
- if(s[i]=='A') A++;
- else if(s[i]=='I') I++;
- if(!I) printf("%d",A);
- else if(I==) printf("");
- else printf("");
- return ;
- }
Problem B
C:
明明写起来很简单的一道题目被我弄复杂了
考虑维护序列中原来的值和增量
由于只要求当前最后一个数的增量,因此可以每次仅在增加的最后一个数打上标记
这样在删除数时将当前末尾的增量向前推就能满足要求
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- typedef pair<int,int> P;
- const int MAXN=2e5+;
- int n,det[MAXN],dat[MAXN],lst;double sum;
- int main()
- {
- scanf("%d",&n);
- dat[]=;lst=;
- while(n--)
- {
- int op,x,y;
- scanf("%d",&op);
- if(op==) scanf("%d%d",&x,&y),sum+=x*y,det[x]+=y;
- else if(op==) scanf("%d",&x),sum+=x,dat[++lst]=x;
- else sum-=dat[lst]+det[lst],det[lst-]+=det[lst],det[lst--]=;
- printf("%.6lf\n",sum/lst);
- }
- return ;
- }
Problem C
结果我这个zz用树状数组维护了这个东西,还将一个增量写成了赋值WA了好几次……
- #include <bits/stdc++.h>
- using namespace std;
- #define X first
- #define Y second
- typedef long long ll;
- typedef pair<int,int> P;
- const int MAXN=2e5+;
- int n;ll bit[MAXN<<],dat[MAXN<<],lst,sum;
- void Update(int pos,int x)
- {while(pos<=n) bit[pos]+=x,pos+=pos&(-pos);}
- ll Query(int pos)
- {ll ret=;while(pos) ret+=bit[pos],pos-=pos&(-pos);return ret;}
- int main()
- {
- scanf("%d",&n);
- lst=;sum=;
- for(int i=;i<=n;i++)
- {
- int op,x,y;
- scanf("%d",&op);
- if(op==)
- {
- scanf("%d%d",&x,&y);
- Update(,y);Update(x+,-y);
- dat[]+=y;dat[x+]-=y;
- sum+=x*y;
- }
- else if(op==)
- {
- scanf("%d",&x);
- Update(lst+,x);Update(lst+,-x);
- dat[++lst]+=x;dat[lst+]=-x;
- sum+=x;
- }
- else
- {
- sum-=Query(lst);
- Update(lst+,-dat[lst+]);
- Update(lst,dat[lst+]);
- dat[lst]+=dat[lst+];dat[lst+]=;lst--;
- }
- printf("%.6lf\n",1.0*sum/lst);
- }
- return ;
- }
Problem C
D:
可以发现真正的状态数只有$2*n$个,对于每一位只有加/减两种状态
发现$y$的值就是走过的总距离,这样用$dp[n][2]$记忆化搜索在当前状态走到边界有多远
每个状态在入栈时打上标记,如果再次走到形成环就是循环了
这样对于每个$i$就是对应于$dp[i+1][0]$时的解
注意将边界$dp[1][0/1]$设为-1
- #include <bits/stdc++.h>
- using namespace std;
- #define X first
- #define Y second
- typedef long long ll;
- typedef pair<int,int> P;
- const int MAXN=2e5+;
- int n,dat[MAXN],vis[MAXN][];ll dp[MAXN][];
- ll dfs(int x,int d)
- {
- if(x<=||x>n) return ;
- if(vis[x][d]==) return -;
- if(vis[x][d]==) return dp[x][d];
- vis[x][d]=;
- ll dist=d?dfs(x+dat[x],):dfs(x-dat[x],);
- vis[x][d]=;
- if(dist==-) return dp[x][d]=-;
- else return dp[x][d]=dist+dat[x];
- }
- int main()
- {
- scanf("%d",&n);
- for(int i=;i<=n;i++) scanf("%d",&dat[i]);
- vis[][]=vis[][]=;
- for(int i=;i<=n;i++)
- {
- if(!vis[i][]) dfs(i,);
- printf("%I64d\n",dp[i][]==-?-:i+dp[i][]-);
- }
- return ;
- }
Problem D
E:
由于每个点只有一个后继,因此最终图只有环和链
将环的情况排除后就只剩链了
对于一条链,一个可行解为$a_1*w_1+a_2*w_2...+a_n*w_n(a_1>a_2>...>a_n)$
但由于后面的限制条件不能直接背包,考虑将式子变换后消除限制:
设$d_i=a_i-a_{i-1},suf_i=w_i+w_{i+1}...+w_n$,
这样式子变为$d_1*suf_1+d_2*suf_2...+d_n*suf_n$
发现就是一个完全背包,且可以将各个链合并在一起考虑
但注意,这个背包要求$d_1,d_2...d_{n-1}>0$,否则无法保证条件成立
也就是原式每个物品的个数要达到${n-1,n-2...2,1,0}$的下限!
这样就先都取一个,并将其从$t$中减去再跑背包即可
- #include <bits/stdc++.h>
- using namespace std;
- #define X first
- #define Y second
- typedef long long ll;
- typedef pair<int,int> P;
- const int MAXN=1e5+,MOD=1e9+;
- int n,q,t,x,y,a[MAXN],nxt[MAXN],d[MAXN],dp[MAXN],cnt;
- int main()
- {
- scanf("%d%d%d",&n,&q,&t);
- for(int i=;i<=n;i++) scanf("%d",&a[i]);
- for(int i=;i<=q;i++)
- scanf("%d%d",&x,&y),nxt[x]=y,d[y]++;
- for(int i=;i<=n&&t>=;i++)
- {
- if(d[i]) continue;
- int sum=;//t<0一定要及时退出!
- for(int j=i;j&&t>=;j=nxt[j])
- {
- cnt++;
- sum+=a[j];a[j]=sum;
- if(nxt[j]) t-=a[j];
- }
- }
- if(cnt<n||t<) return puts(""),;
- dp[]=;
- for(int i=;i<=n;i++)
- for(int j=a[i];j<=t;j++)
- (dp[j]+=dp[j-a[i]])%=MOD;
- printf("%d",dp[t]);
- return ;
- }
Problem E
同时还有一个注意点:$t<0$时要及时退出否则会爆$int$
[Codeforces #174] Tutorial的更多相关文章
- [Codeforces #172] Tutorial
Link: Codeforces #172 传送门 A: 一眼看上去分两类就可以了 1.每个矩形只有两条边相交,重合的形状为菱形 2.每个矩形四条边都有相交 对于情况1答案为$h*h/sin(a)$ ...
- [Codeforces #514] Tutorial
Link: Codeforces #514 传送门 很简单的一场比赛打崩了也是菜得令人无话可说…… D: 一眼二分,发现对于固定的半径和点,能包含该点的圆的圆心一定在一个区间内,求出区间判断即可 此题 ...
- [Codeforces #210] Tutorial
Link: Codeforces #210 传送门 A: 贪心,对每个值都取最大值,不会有其他解使答案变优 #include <bits/stdc++.h> using namespace ...
- [Codeforces #196] Tutorial
Link: Codeforces #196 传送门 A: 枚举 #include <bits/stdc++.h> using namespace std; #define X first ...
- [Codeforces #190] Tutorial
Link: Codeforces #190 传送门 A: 明显答案为$n+m-1$且能构造出来 #include <bits/stdc++.h> using namespace std; ...
- [Codeforces #211] Tutorial
Link: Codeforces #211 传送门 一套非常简单的题目,但很多细节都是错了一次才能发现啊…… 还是不能养成OJ依赖症,交之前先多想想corner case!!! A: 模拟,要特判0啊 ...
- [Codeforces #192] Tutorial
Link: Codeforces #192 传送门 前两天由于食物中毒现在还要每天挂一天的水 只好晚上回来随便找套题做做找找感觉了o(╯□╰)o A: 看到直接大力模拟了 但有一个更简便的方法,复杂度 ...
- [Codeforces #201] Tutorial
Link: 传送门 代码量很少的一套思维题 A: 试一试发现最后状态一定是所有$min,max$间$gcd$的倍数 直接判断数量的奇偶性即可 #include <bits/stdc++.h> ...
- [Codeforces #188] Tutorial
Link: Codeoforces #188 传送门 A: 先全转为正数,后面就全是指数级增长了 #include <bits/stdc++.h> using namespace std; ...
随机推荐
- 逃生(HDU4857 + 反向拓扑排序)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4857 题面是中文题面,就不解释题意了,自己点击链接去看下啦~这题排序有两个条件,一个是按给定的那个序列 ...
- web-project 故障查看功能 检测是否启动fmd服务
def check_fmd_service(): try: output = subprocess.check_output('svcs -H -o state fmd',shell=True) st ...
- recycleView实现item点击更改该item颜色,其它item颜色变回
项目中需要横向滚动效果,按照以前的思路,我会写一个ScrollView,里边加一个LinearLayout,在代码中动态加入控件,然后动态删除或者改变颜色,现在android有了新控件Recycler ...
- python碎片记录(一)
1.python中求幂运算 2**31-1 2的31次方减一(32位整型数据范围为-2^31~2^31-1,最高位为符号位,负向值比正向值绝对值大1) 2.python中整数除法 x=x//1 ...
- ms17010利用失败解决一则
没有反弹得到session并且提示如下: [-] 10.0.131.2:445 - Service failed to start, ERROR_CODE: 216 换了一个payload set p ...
- webpack版本1与版本2的若干写法区别
2.x的环境遇到类似this._init is not a function的报错. 版本1.x的写法: resolve: { extensions: ['', '.js', '.vue'] }, m ...
- CreateProcess中的部分参数理解
函数原型,这里写Unicode版本 WINBASEAPIBOOLWINAPICreateProcessW( _In_opt_ LPCWSTR lpApplicationName, //可执行文件名字 ...
- 【Windows使用笔记】使Onedrive同步任意文件夹
因为度盘实在是有点垃圾,经常看的剧之类的或者其他软件资源啥的动不动就被封. 所以跑去某宝买了一个5T的企业子账号,安全性不清楚,重要的隐私数据反正都用移动硬盘备份了.主要就是存一些资源性的文件吧.而且 ...
- [How to]如何通过xib来自定义UIViewController
代码:https://github.com/xufeng79x/CreateControllerByXib 1.简介 UIViewController实例可以通过代码.storyborad或者xib方 ...
- 关于eclipase出现的problems during content assist报错问题
解决办法: 把下面箭头指的地方改为上面箭头的指向