套题T2
数学(math.cpp)
DXY的数学很差。。。
对于所有1<=i<=N求(2^i – i^2)能被7整除的个数。(N<=1000000)
样例输入:
3
样例输出:
1
你在代码中输入一个int范围内的数字的时候
如果你用int去mod longlong
mod出来的是个int
#include<iostream> #include<cstdio> #include<algorithm> #define LiangJiaJun main using namespace std; int kk[4]={2,4,1},ans=0;long long n; int LiangJiaJun(){ cin>>n; for(long long i=1;i<=n;i++){ long long x=(kk[(i-1)%3LL]+7LL-((i*i)%7LL))%7LL; if(x==0){ ++ans; } } cout<<ans<<endl; return 0; }
考虑到N可能很大,模拟一下2^i的情况,可以得到kk数组
+7LL有两个点
1.7默认是int,LL后缀默认long long不会溢出
2.7防止取余出现负数
由于都是对7取模,我们可以分步取模
发现2^i对7取模有规律,只要i^2对7取模与其相等就得解
面包(bread.cpp)
DXY想在一些城市之间开一家面包店。
面包店必须要和小麦店连通,但是这些城市中有小麦店的城市只有K个,很坑的是DXY不喜欢在有小麦店的城市开面包店。一共有n个城市,m条双向路径,K个城市有小麦店。求面包店和小麦店的最短距离是多少。(不能开店的话输出-1)
第一行:n,m,k
第二行到第m+1行,m条路径,u,v,w(表示从u城市到v城市有一条长度为w的边)
第三行一共k个数,表示有小麦店的城市的编号。
样例:
输入:
5 4 2
1 2 5
1 2 3
2 3 4
1 4 10
1 5
输出:
3
输入:
3 1 1
1 2 3
3
输出:
-1
刚开始想写spfa 后来觉得……
不存在经过2条路的最短路
最短路一定是直连的
用f数组来存是不是小麦店 最早的时候全部赋值0代表不是小麦 读入的时候改成1表示是小麦店
然后就只需要遍历每一条边
如果他们的2个端点满足一个小麦一个开店就可能成为最短
每次更新ans 然后输出就完了
于是就不需要存图 开个二维数组就完了
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #define maxn 100005 #define qaq 0xfffffff using namespace std; int ans=qaq; int n,m,k;//<=100000 int xiaomai; int f[maxn]; int QAQ[maxn][3]; int main() { memset(f,0,sizeof(f)); cin>>n>>m>>k; for(int i=1;i<=m;++i) { scanf("%d%d%d",&QAQ[i][0],&QAQ[i][1],&QAQ[i][2]);//A B W } for(int i=1;i<=k;++i) { scanf("%d",&xiaomai); f[xiaomai]=1; } for(int i=1;i<=m;++i) { if(f[QAQ[i][0]]!=f[QAQ[i][1]]) { ans=min(ans,QAQ[i][2]); } } if(ans==qaq)puts("-1"); else printf("%d\n",ans); return 0; }
dq(dq.cpp)
给定一个数列a[1],a[2],a[3]…a[n],每次操作将数列的最后一个数字放到数列的第一位,问是否存在一种操作,使得操作之后数列变为一个不下降序列。最少的操作数是多少。不存在就输出-1
样例输入
2
2 1
样例输出
1
样例输入
3
1 3 2
样例输出
-1
样例输入
2
1 2
样例输出
0
先判断最后一个是不是小于等于第一个,如果不是就有两种情况
①如果是的话,就从后面往前面搬,找到第一个不满足条件的,截取然后搬过去,检验一下前面那一段和后面那一段是不是都是不下降的,并且最后一个小于等于第一个
②原序列本就是不下降的
然后判断一下就完啦
#include<iostream> #include<cstdio> #include<algorithm> #define LiangJiaJun main #define INF 1999122700 using namespace std; int n,a[200004],k,l,r,mint=INF,maxn=0; int LiangJiaJun(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); mint=min(mint,a[i]); maxn=max(maxn,a[i]); } for(int i=1;i<=n;i++)a[i+n]=a[i]; l=n+1;r=n+n;int ans=0; while(l>0&&r>n){ if(a[l]==mint&&a[r]==maxn){ bool q=0; for(int i=l;i<r;i++){ if(a[i]>a[i+1]){ q=1;break; } } if(!q)return printf("%d\n",ans),0; } --l;--r;++ans; } puts("-1"); return 0; }