给定正数 n ( 10 ≤ n ≤ 1 0 9 ) n(10≤n≤10^9) n(10≤n≤109),找到三个互不相同的数 a,b,c,满足:
对于一个较小的数和很大的数,很容易互质。
所以构造 c=1,从小到大枚举a,b=n-a-1,找到第一个互质的数退出。
#include
using namespace std;
#define Ios ios::sync_with_stdio(false),cin.tie(0)
#define mem(a,b) memset(a,b,sizeof a)
#define int long long
#define PII pair
#define pb push_back
#define fi first
#define se second
#define endl '\n'
map<int,int> mp;
const int N = 200010, mod = 1e9+7;
int T, n, m, k;
int a[N];
int prim[N], cnt, f[N];
void Prim()
{
for(int i=2;i<=n;i++)
{
if(!f[i]) prim[++cnt]=i;
for(int j=1;prim[j]<=n/i;j++)
{
f[prim[j]*i] = 1;
if(i%prim[j]==0) break;
}
}
}
signed main(){
// Ios;
cin>>T;
while(T--)
{
cin>>n;
for(int i=2;i<=n;i++)
{
if(i!=n-i-1 && __gcd(i, n-i-1)==1){
cout << i <<" "<<n-i-1 <<" "<<1<<endl;
break;
}
}
}
return 0;
}
给定 n 个数,现在要将其变成一个全排列,最少用多少次下列操作?
a[i] %= x
。一定要想到一个性质:
对于两个数 x 和 y,如果 y ≤ 2*x,那么 y 无法取模得到 x。
所以越大的数越好,能够取模得到的数越多。
为了操作次数最少,首次在全排列中出现的数不需要改变。
将需要改变的数存下来,从小到大排序,和需要变化成的数一一对应。
#include
using namespace std;
#define Ios ios::sync_with_stdio(false),cin.tie(0)
#define mem(a,b) memset(a,b,sizeof a)
#define int long long
#define PII pair
#define pb push_back
#define fi first
#define se second
#define endl '\n'
map<int,int> mp;
const int N = 200010, mod = 1e9+7;
int T, n, m, k;
int a[N], f[N], b[N], c[N];
signed main(){
Ios;
cin>>T;
while(T--)
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i], f[i]=0;
int cnt1=0, cnt2=0;
for(int i=1;i<=n;i++)
{
if(a[i]<=n && !f[a[i]]) f[a[i]]=1;
else b[++cnt1]=a[i];
}
for(int i=1;i<=n;i++)
{
if(!f[i]) c[++cnt2]=i;
}
sort(b+1, b+cnt1+1);
int flag=0;
for(int i=1;i<=cnt1;i++)
{
if(b[i] <= c[i]*2) flag=1;
}
if(flag) cout<<-1<<endl;
else cout<<cnt1<<endl;
}
return 0;
}
今天vp这两题都没写出来。。
第一题没想到这样构造,一直想着将n整除一个数。。
第二题没想到性质。。