1. 程式人生 > >【寒假集訓系列DAY3】

【寒假集訓系列DAY3】

然而 \n get tro sim 個數 ont putchar 系列

DAY2的坑之後會補上

DAY3

今天暴力分拿的還是不錯的...60+30+25=115,但還是太弱了呀,每題都只會暴力(話說第3題直接輸-1給了15分,本以為只會給5分,然後打了半個小時的爆搜...)

T1:Simple (圖樣圖森破)

【問題描述】
對於給定正整數 n,m,我們稱正整數 c 為好的,當且僅當存在非
負整數 x,y,使得 n*x+m*y=c。
現在給出多組數據,對於每組數據,給定 n,m,q,求[1,q]內有
多少個正整數不是好的。
【輸入格式】
第一行,一個整數 T 表示數據組數。
接下來每行三個數,分別表示 n,m,q,即一組詢問。
【輸出格式】
對於每組數據,輸出一行表示答案。

考試的時候打了一個暴力,妥妥的60分...

交卷前問了一下Venus巨佬,然而他說是一道DP題,感覺瞬間明白了什麽,其實就是一道簡單的DP啊,但來不及改了...

思路:DP(當然數學方法也可以,但是好煩啊...)類似於背包?反正暴力填表就好了..把“好的數”求出來,然後減一下就好了

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #define int long long
 6
using namespace std; 7 inline int read(){ 8 char chr=getchar(); int f=1,ans=0; 9 while(!isdigit(chr)) {if(chr==-) f=-1;chr=getchar();} 10 while(isdigit(chr)) {ans=(ans<<3)+(ans<<1);ans+=chr-0;chr=getchar();} 11 return ans*f; 12 } 13 void write(int x){ 14 if
(x<0) putchar(-),x=-x; 15 if(x>9) write(x/10); 16 putchar(x%10+0); 17 } 18 int n,m,h,f[2000005]; 19 signed main(){ 20 freopen("simple.in","r",stdin); 21 freopen("simple.out","w",stdout); 22 int t=0; 23 t=read(); 24 for(int i=1;i<=t;i++){ 25 n=read(),m=read(),h=read(); 26 memset(f,-1,sizeof(f)); 27 f[0]=0; int last=0; 28 for(int j=1;f[(last+m)%n]==-1;j++) f[(last+m)%n]=f[last]+m,last=(last+m)%n; 29 int ans=0; 30 for(int i=0;i<n;i++) 31 if(f[i]!=-1&&f[i]<=h) ans+=(h-f[i])/n+1; 32 printf("%lld\n",h-ans+1); 33 } 34 return 0; 35 }

【寒假集訓系列DAY3】