A
#include <bits/stdc++.h> #define PI acos(-1.0) #define mem(a,b) memset((a),b,sizeof(a)) #define TS printf("!!! ") #define pb push_back #define inf 1e9 //std::ios::sync_with_stdio(false); using namespace std; //priority_queue<int,vector<int>,greater<int>> que; get min const double eps = 1.0e-8; typedef pair<int, int> pairint; typedef long long ll; typedef unsigned long long ull; //const int maxn = 3e5 + 10; const int maxm = 300; const int turn[4][2] = {{1, 0}, { -1, 0}, {0, 1}, {0, -1}}; //priority_queue<int, vector<int>, less<int>> que; //next_permutation ll mod = 3e7; int weight; int from,to; vector<pair<int,int> > place[200005]; int main() { int anser=0; int n; cin >> n; for(int i=2; i<=n; i++) { if(n%i==0) anser++; } cout<<anser<<endl; }
B
#include <bits/stdc++.h> #define PI acos(-1.0) #define mem(a,b) memset((a),b,sizeof(a)) #define TS printf("!!! ") #define pb push_back #define inf 1e9 //std::ios::sync_with_stdio(false); using namespace std; //priority_queue<int,vector<int>,greater<int>> que; get min const double eps = 1.0e-8; typedef pair<int, int> pairint; typedef long long ll; typedef unsigned long long ull; //const int maxn = 3e5 + 10; const int maxm = 300; const int turn[4][2] = {{1, 0}, { -1, 0}, {0, 1}, {0, -1}}; //priority_queue<int, vector<int>, less<int>> que; //next_permutation ll mod = 3e7; int num[100005]; int check(int x,int y) { if(x==y) return 0; if(x>y) return 1; return 2; } int main() { int n; int anser=0; int nowx,nowy; nowx=nowy=0; cin >> n; string a; cin >> a; int now=0; int belong=0; for(int i=0; i<n; i++) { if(a[i]=='U') nowy++; else nowx++; belong=check(nowx,nowy); num[i]=belong; if(i>=2) if(num[i]+num[i-2]==3) anser++; // cout<<i<<" "<<nowx<<" "<<nowy<<endl; // cout<<anser<<endl; } cout<<anser<<endl; }
C
简单几何 题意题
给你一个圆和一个点,让你在给定圆内画一个圆,使得答案圆不能包含给定点,而且使得给定圆没有被答案圆覆盖的面积最小。输出答案圆的圆心和半径即可。
#include <bits/stdc++.h> #define PI acos(-1.0) #define mem(a,b) memset((a),b,sizeof(a)) #define TS printf("!!! ") #define pb push_back #define inf 1e9 //std::ios::sync_with_stdio(false); using namespace std; //priority_queue<int,vector<int>,greater<int>> que; get min const double eps = 1.0e-8; typedef pair<int, int> pairint; typedef long long ll; typedef unsigned long long ull; //const int maxn = 3e5 + 10; const int maxm = 300; const int turn[4][2] = {{1, 0}, { -1, 0}, {0, 1}, {0, -1}}; //priority_queue<int, vector<int>, less<int>> que; //next_permutation ll mod = 3e7; int num[100005]; int main() { double R,x1,x2,y1,y2; cin >>R >> x1 >> y1 >> x2 >> y2; double xap,yap,r; double len=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2); double dis1=sqrt(len); if(len>=R*R) { printf("%.7f %.7f %lf",x1,y1,R); return 0; } if(x1==x2&&y1==y2) { printf("%.7f %.7f %.7f",x1+R/2,y1,R/2); return 0; } r=(R+dis1)/2.0; xap=x2+(x1-x2)*(r/dis1); yap=y2+(y1-y2)*(r/dis1); printf("%.7f %.7f %lf",xap,yap,r); }
D
给你两个长为N包含0的数字串 0可以变化为1-k的任何数
要求你求出第一个串比第二个大的可能性(一个分数)模上1e9+7
总共的可能性数量很好想 是K的0数量次方 再把分数转化为求逆元就变为:比原串大的方案数乘以 总方案数对MOD的逆元 模MOD
dp[i][0]表示到第i个两个字典序相等的方案数 dp[i][1]表示到第i个第一个比第二个字典序大的方案数
dp[i][1]可以由dp[i-1][0]与dp[i-1][1]转换而来 而 dp[i][0]只能由dp[i-1][0]转换而来
所以分类讨论
1.a=ai b=bi时
相等时
dp[i][0]=dp[i-1][0]
dp[i][1]=dp[i-1][1]
前大于后时
dp[i][1]=dp[i-1][0]+dp[i-1][1]
dp[i][0]=0
后大于前时
dp[i][1]=dp[i][0]=0
2.a=0 b=bi时
dp[i][0]=dp[i-1][0]
dp[i][1]=dp[i-1][1]*k+dp[i-1][0]*(k-bi)
3.a=ai b=0时
dp[i][0]=dp[i-1][0]
dp[i][1]=dp[i-1][1]*k+dp[i-1][0]*(b-1)
4.a=b=0
dp[i][0]=dp[i-1][0]*k
dp[i][1]=dp[i-1][1]*k*k+dp[i-1][0]*(k-1)*k/2
一直dp到n
#include <bits/stdc++.h> #define PI acos(-1.0) #define mem(a,b) memset((a),b,sizeof(a)) #define TS printf("!!! ") #define pb push_back #define inf 1e9 //std::ios::sync_with_stdio(false); using namespace std; //priority_queue<int,vector<int>,greater<int>> que; get min const double eps = 1.0e-8; typedef pair<int, int> pairint; typedef long long ll; typedef unsigned long long ull; const int turn[4][2] = {{1, 0}, { -1, 0}, {0, 1}, {0, -1}}; //priority_queue<int, vector<int>, less<int>> que; //next_permutation const int mod = 1e9+7; int sum=0; ll dp[1000005][3]; int num[3][1000005]; ll quickpow(ll x,ll n) { ll res=1; while(n) { if(n&1)res=res*x%mod; x=x*x%mod; n/=2; } return res; } int main() { ll n,m; cin >> n >> m; for(int i=1; i<=2; i++) for(int j=1; j<=n; j++) { scanf("%d",&num[i][j]); } mem(dp,0); dp[0][0]=1; for(int i=1; i<=n; i++) { sum+=(num[1][i]==0); sum+=(num[2][i]==0); if(num[1][i]&&num[2][i]) { if(num[1][i]==num[2][i]) { dp[i][0]=dp[i-1][0]; dp[i][1]=dp[i-1][1]; } else if(num[1][i]>num[2][i]) { dp[i][1]=(dp[i-1][0]+dp[i-1][1])%mod; dp[i][0]=0; } else { dp[i][0]=0; dp[i][1]=dp[i-1][1]; } } else if(num[1][i]==0&&num[2][i]==0) { dp[i][0]=dp[i-1][0]*m%mod; dp[i][1]=((dp[i-1][1]*((m*m)%mod)%mod+dp[i-1][0]*((m-1)*m/2)%mod)%mod)%mod; } else if(num[1][i]==0) { dp[i][0]=dp[i-1][0]%mod; dp[i][1]=(dp[i-1][1]*m%mod+dp[i-1][0]*(m-num[2][i])%mod)%mod; } else if(num[2][i]==0) { dp[i][0]=dp[i-1][0]%mod; dp[i][1]=(dp[i-1][1]*m%mod+dp[i-1][0]*(num[1][i]-1)%mod)%mod; } } ll anser=dp[n][1]*quickpow(quickpow(m,sum),mod-2)%mod; cout<<anser<<endl; }