生活随笔
收集整理的這篇文章主要介紹了
2017-7-22 NOIP模拟赛
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Digits
(digits.cpp/c/pas)
Description
給一個關于 的多項式,并給定一個 ,求該多項式在帶入該 時的值最后 位數字。
Input
第一行兩個整數 、 ;
之后的 行,每行兩個數 和 ,表示多項式的一項 ;
最后一行一個整數 。
Output
輸出 行,按順序輸出該多項式帶入 后值的最后 位數字,若不足 位,則高位補零。
Example
digits.in digits.out
2 1
3 2
1 5
3
0
附加樣例見選手目錄下『digits』文件夾。
Hint
對于 的數據, ;
對于 的數據, 。
/*要求后k位,實際上就是對10^k取模,用快速冪
*/
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
long long n,k,a[
100010],b[
100010],X,tmp[
10],mod,ans,Ans[
10];
using namespace std;
long long Pow(
long long x,
long long t){long long res=
1;while(t){if(t&
1)res=x*res%
mod;x=x*x%
mod;t>>=
1;}return res;
}
int main(){freopen("digits.in",
"r",stdin);freopen("digits.out",
"w",stdout);scanf("%lld%lld",&n,&
k);for(
long long i=
1;i<=n;i++)scanf(
"%lld%lld",&a[i],&
b[i]);scanf("%lld",&
X);mod=
1;for(
long long i=
1;i<=k;i++)mod*=
10;X%=
mod;for(
long long i=
1;i<=n;i++
){long long now=((a[i]%mod)*Pow(X,b[i]))%
mod;ans+=
now;}for(
long long i=
1;i<=k;i++
){Ans[i]=ans%
10;ans/=
10;}for(
long long i=k;i>=
1;i--)cout<<Ans[i]<<
endl;fclose(stdin);fclose(stdout);return 0;
} Equation
(equation.cpp/c/pas)
Description
求方程 在 內有多少組正整數解。
Input
一行七個整數 。
Output
一行一個整數,原方程有多少正整數解。
Example
equation.in equation.out
10 -24 74 -25 22 -7 -22 5
附加樣例見選手目錄下『equation』文件夾。
Hint
對于 的數據,方程無解;
對于 的數據, ;
對于 的數據, 。
/*a1x1-a2x2+a3x3-a4x4+a5x5-a6x6=0 方程可化為 a1x1-a2x2+a3x3=a4x4-a5x5+a6x6 通過映射匹配,2n^3跑得過
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<map>
using namespace std;
map<
int,
int>
b;
int a[
7],K,ans;
int main(){freopen("equation.in",
"r",stdin);freopen("equation.out",
"w",stdout);scanf("%d",&
K);bool flag1,flag2;for(
int i=
1;i<=
6;i++
){scanf("%d",&
a[i]);if(a[i]>
0)flag1=
1;if(a[i]<
0)flag2=
1;};a[2]=-a[
2];a[
4]=-a[
4];a[
6]=-a[
6];if(flag1!=
flag2){printf("0");return 0;}for(
int i=
4;i<=
6;i++)a[i]=-
a[i];int now;for(
int i=
1;i<=K;i++
)for(
int j=
1;j<=K;j++
)for(
int k=
1;k<=K;k++
){now=a[
1]*i+a[
2]*j+a[
3]*
k;b[now]++
;}for(
int i=
1;i<=K;i++
)for(
int j=
1;j<=K;j++
)for(
int k=
1;k<=K;k++
){now=a[
4]*i+a[
5]*j+a[
6]*
k;ans+=
b[now];}printf("%d",ans);fclose(stdin);fclose(stdout);return 0;
} ?
Graph
( graph .cpp/c/pas)
Description
小 Y 又開始了一段旅途。
這次,他要經過一個圖,從 號點到達 號點,每個點設有休息站。
小 Y 計劃用最多 天走完全程,除第 天外,每一天小 Y 都必須在休息站過夜。所以,一段路
必須在同一天走完。
小 Y 的體力有限,他希望走的路程最大的一天中走的路盡可能少,請求出這個最小值。
Input
第一行三個整數 、 、 表示圖的頂點數、邊數、天數。
從第二行開始,之后的 行,每行三個整數 、 、 表示從 和 間有一條雙向道路,長度
為 。
Output
一行一個正整數,如果小 Y 能走完全程,輸出走的路程最大的一天中走的路程最小值,否則輸
出 。
Example
graph.in graph.out
3 2 4
3 2 4
1 2 1
4
附加樣例見選手目錄下『graph』文件夾。
Hint
對于 的數據, ;
對于 的數據, ;
對于 的數據, , , ;
保證沒有重邊和自環。
/*求出最小生成樹,答案一定在最小生成樹上;如果起點和終點不聯通,輸出-1;答案為最小生成樹上起點和終點間唯一路徑上的最大邊權。
*/
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
struct node{int from,to,v;
}e[200010];
int fa[
7510],m,n,k;
bool cmp(node x,node y){return x.v<
y.v;
}
int find(
int x){if(fa[x]==x)
return x;return fa[x]=
find(fa[x]);
}
bool connect(
int x,
int y){int f1=find(x),f2=
find(y);if(f1==f2)
return 0;fa[f1]=
f2;return 1;
}
int main(){freopen("graph.in",
"r",stdin);freopen("graph.out",
"w",stdout);scanf("%d%d%d",&n,&m,&
k);for(
int i=
1;i<=n;i++
)fa[i]=
i;for(
int i=
1;i<=m;i++
)scanf("%d%d%d",&e[i].
from,&e[i].to,&
e[i].v);sort(e+
1,e+m+
1,cmp);bool flag=
false;
int tot=
0;for(
int i=
1;i<=m;i++
){if(connect(e[i].
from,e[i].to))tot++
;if(find(
1)==
find(n)){printf("%d",e[i].v);flag=
true;break;}if(tot==n-
1)
break;}if(!flag)printf(
"-1");fclose(stdin);fclose(stdout);return 0;
} ?
轉載于:https://www.cnblogs.com/thmyl/p/7220830.html
總結
以上是生活随笔為你收集整理的2017-7-22 NOIP模拟赛的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。