zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    jQuery offset获取坐标不精确的问题
    RPG Maker VX地图随机气泡对话 Ver1.0
    Qt绘图控件qwt绘制等比例坐标图
    Java服务端极光推送整合Ios、Android
    Jpush给 iOS 平台推送 title 值失败
    java之Hibenate中监听事件的重写和二级cache缓存
    java之Hibeante中SQL语句的使用
    Hibernate注解符合主键关联关系、持久化传播、继承映射
    hibernate之数据库注解关联关系
    hibernate(四) 双向多对多映射关系
  • 原文地址:https://www.cnblogs.com/Aragaki/p/8613040.html
Copyright © 2011-2022 走看看