Codeforces 935 简单几何求圆心 DP快速幂求与逆元

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;
}
View Code

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;
}
View Code

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);
}
View Code

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;
}
View Code
原文地址:https://www.cnblogs.com/Aragaki/p/8613040.html