码迷,mamicode.com
首页 > 其他好文 > 详细

某天的测试订正

时间:2017-09-23 21:31:15      阅读:288      评论:0      收藏:0      [点我收藏+]

标签:iostream   geo   ios   技术分享   clu   复杂度   eps   gre   second   

T1:

1671: Count

时间限制: 1 Sec  内存限制: 512 MB
提交: 66  解决: 27
[提交][状态][讨论版]

题目描述

技术分享

输入

技术分享

输出

技术分享

样例输入

6 1


6 3

样例输出

10


2248

提示

 

技术分享

难题,考场上果断写了暴力~~

 

技术分享最后一个+是-,但是答案=s1+s2是应该用加号

技术分享

    技术分享

代码中sum记录一下前缀和,如果前i个数sum是j的方案数大于w的话前i-1个数取得的值就要有限制

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define ll long long
#define pp 998244353
#define maxn 100005
using namespace std;
long long anss2,anss3;
ll pri[maxn],prinum,sub[maxn],subnum,num[maxn],dp[205][maxn],sum[maxn];
bool flag[maxn];
void find_pri(ll n)
{
    ll need=sqrt(n);
    for(ll i=2;i<=need;i++)
    {
        if(!flag[i]) 
        {
            pri[++prinum]=i;
        }
        for(ll j=1;j<=prinum&&i*pri[j]<=need;j++)
        {
            flag[i*pri[j]]=1;
            if(i%pri[j]==0) break;
        }
    }
}
long long power_mod(long long a,ll b,ll c)
{
    long long tmp=a,ans=1;
    while(b)
    {
        if(b%2)
        {
            ans=ans*tmp%c;
        }
        tmp=tmp*tmp%c;
        b>>=1;
     } 
     return ans;
}
void find_submultiple(ll n,ll m)
{
    anss2=1;
    for(ll i=1;i<=prinum&&pri[i]*pri[i]<=n;i++)
    {
        if    ((n%pri[i])==0)
        {
            sub[++subnum]=i;
            while(n%pri[i]==0) 
            {
                num[subnum]++;
                n/=pri[i];
             }
            anss2=anss2*(num[subnum]+1)%pp; 
        }
    }
    if(n>1) sub[++subnum]=n,num[subnum]=1,anss2=anss2*(2)%pp;
    anss2=power_mod(anss2,m<<1,pp); 
}
void Dp(ll n,ll m)
{
    anss3=1;
    for(ll k=1;k<=subnum;k++)
    {
        ll Num=num[k]*m;
        for(ll i=0;i<=Num;i++) sum[i]=1;
        for(ll i=1;i<=(m<<1);i++)
        {
            dp[i][0]=1;
            for(ll j=1;j<=Num;j++)
            {
                dp[i][j]=sum[j];
                if(num[k]<j)
                {
                    dp[i][j]=dp[i][j]-sum[j-num[k]-1];
                }
            }
            sum[0]=dp[i][0];
            for(ll j=1;j<=Num;j++)
            {
                sum[j]=(sum[j-1]+dp[i][j])%pp;
             } 
        }
        anss3=(anss3*dp[m<<1][Num])%pp;
    }
}
int main()
{
    ll n,m;
    scanf("%lld %lld",&n,&m);
    find_pri(n);
    find_submultiple(n,m);
    Dp(n,m);
    long long Ni=(pp+1)/2;
    printf("%lld\n",(anss3+anss2+pp)*Ni%pp); 
}

 T2:

Delete

时间限制: 2 Sec  内存限制: 512 MB  Special Judge
提交: 116  解决: 21
[提交][状态][讨论版]

题目描述

技术分享

输入

技术分享

输出

技术分享

样例输入

3
1 2 3 

样例输出

2
2 1 2
1 3

提示

 

技术分享

 暴力每次找出最长上升或下降子序列

Dilworth定理貌似给出了最坏时间复杂度的保证

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<vector>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<int,int> pr;
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,n,a) for(int i=n;i>=a;i--)
#define Rep(i,u) for(int i=head[u];i;i=Next[i])
#define clr(a) memset(a,0,sizeof(a))
#define pb push_back
#define mp make_pair
#define fi first
#define sc second
#define pq priority_queue
#define pqb priority_queue <int, vector<int>, less<int> >
#define pqs priority_queue <int, vector<int>, greater<int> >
#define vec vector
ld eps=1e-9;
ll pp=1000000007;
ll mo(ll a,ll pp){if(a>=0 && a<pp)return a;a%=pp;if(a<0)a+=pp;return a;}
ll powmod(ll a,ll b,ll pp){ll ans=1;for(;b;b>>=1,a=mo(a*a,pp))if(b&1)ans=mo(ans*a,pp);return ans;}
void fre() { freopen("c://test//input.in", "r", stdin); freopen("c://test//output.out", "w", stdout); }
//void add(int x,int y,int z){ v[++e]=y; next[e]=head[x]; head[x]=e; cost[e]=z; }
int dx[5]={0,-1,1,0,0},dy[5]={0,0,0,-1,1};
ll read(){ ll ans=0; char last= ,ch=getchar();
while(ch<0 || ch>9)last=ch,ch=getchar();
while(ch>=0 && ch<=9)ans=ans*10+ch-0,ch=getchar();
if(last==-)ans=-ans; return ans;
}
#define maxn 1000005
int a[maxn],b[maxn],fl[maxn],id[maxn],pi[maxn],qi[maxn],f[maxn],Time;
#include<vector>
vector<int> ans[605];
int find_up(int n)
{
    int nu=0;
    for(int i=1;i<=n;i++)
    if(!fl[i])
    {
        if(a[i]>b[nu]) 
        {
            f[i]=id[nu];
            b[++nu]=a[i];
            id[nu]=i;
            continue;
        }
        int p=upper_bound(b+1,b+nu+1,a[i])-b;
        b[p]=a[i];id[p]=i;
        f[i]=id[p-1];
    }
    int x=id[nu],bb=0;
    while(x)
    {
        pi[++bb]=x;
        x=f[x];
    }
    return     bb;
}
int find_down(int n)
{
    int nu=1;
    b[1]=a[1];
    for(int i=2;i<=n;i++)
    if(!fl[i])
    {
        if(-a[i]>b[nu]) 
        {
            f[i]=id[nu];
            b[++nu]=-a[i];
            id[nu]=i;
            continue;
        }
        int p=upper_bound(b+1,b+nu+1,-a[i])-b;
        b[p]=-a[i];id[p]=i;
        f[i]=id[p-1];
    }
    int x=id[nu],bb=0;
    while(x!=0)
    {
        qi[++bb]=x;
        x=f[x];
    }
    return     bb;
}
int main()
{
    int n=read(),num=n;
    rep(i,1,n) a[i]=read();
    while(num>0)
    {
        ++Time;
        int p=find_up(n);
        int q=find_down(n);
        if(p>q)
        {
            num-=p;
            for(int i=p;i>=1;i--)
            {
                ans[Time].push_back(a[pi[i]]),fl[pi[i]]=1;
            }
        }else
        {
            num-=q;
            for(int i=q;i>=1;i--)
            {
                ans[Time].push_back(a[qi[i]]),fl[qi[i]]=1;
             } 
        }
    }
     printf("%d\n",Time);
     for(int i=1;i<=Time;i++)
     {
         int size=ans[i].size();
         printf("%d ",size);
         for(int j=0;j<size-1;j++)
             printf("%d ",ans[i][j]);
        printf("%d\n",ans[i][size-1]);      
    }
    return 0; 
 } 

代码懒得写,贴XT的。可以重载

 

技术分享

输入

技术分享

输出

技术分享

样例输入

5 97

样例输出

11

提示

 

技术分享

 考场上我的做法貌似取模的时候有点问题。

这就是数学和编程的区别吧还要考虑精度误差。

技术分享

 

       技术分享

技术分享

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59 #include<iostream> 
#include<cstdio> 
#include<algorithm> 
using namespace std; 
#define ll long long 
ll n,pp,matrix[3][3],ans[3],c[3],C[3][3]; 
void power_mod(ll b,ll pp) 
{ 
    matrix[2][2]=1;matrix[1][2]=1;matrix[2][1]=1; 
    while(b) 
    { 
        if(b%2) 
        { 
            for(ll i=1;i<=2;i++) 
            { 
                c[i]=0; 
                for(ll j=1;j<=2;j++) 
                { 
                    c[i]=(c[i]+matrix[i][j]*ans[j])%pp; 
                } 
            } 
            for(ll i=1;i<=2;i++) 
            ans[i]=c[i]; 
        } 
        for(ll i=1;i<=2;i++) 
        { 
            for(ll j=1;j<=2;j++) 
            { 
                C[i][j]=0; 
                for(ll k=1;k<=2;k++) 
                C[i][j]=(C[i][j]+matrix[i][k]*matrix[k][j])%pp; 
            } 
        } 
        for(ll i=1;i<=2;i++) 
            for(ll j=1;j<=2;j++) 
            { 
                matrix[i][j]=C[i][j]; 
            } 
        b>>=1; 
    } 
} 
int main() 
{ 
    scanf("%lld %lld",&n,&pp); 
    ans[1]=2;ans[2]=1; 
    power_mod(n,pp); 
    if(n%2==0) 
    { 
        printf("%lld\n",(ans[1]-1+pp)%pp); 
    }else
    printf("%lld\n",ans[1]); 
      
}  

 

 

某天的测试订正

标签:iostream   geo   ios   技术分享   clu   复杂度   eps   gre   second   

原文地址:http://www.cnblogs.com/dancer16/p/7582373.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!