某天的测试订正
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了某天的测试订正相关的知识,希望对你有一定的参考价值。
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]); }
以上是关于某天的测试订正的主要内容,如果未能解决你的问题,请参考以下文章